我有一个异步UrlConnections的以下代码。如果请求失败,
我将NSString
添加到NSMutableArray
中保存在NSUserDefaults
中的[NSURLConnection sendAsynchronousRequest:theRequest queue:mainQueue completionHandler:^(NSURLResponse *response, NSData *responseData, NSError *error) {
NSHTTPURLResponse *urlResponse = (NSHTTPURLResponse *)response;
if (!error) {
//something
}
else {
NSMutableArray *unprocessedSubscription=[[NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"];
if(unprocessedSubscription==nil)
unprocessedSubscription=[[NSMutableArray alloc]init];
NSString * subscriptionToAdd=@"something";
[unprocessedSubscription addObject:subscriptionToAdd];
[[NSUserDefaults standardUserDefaults]setObject:unprocessedSubscription forKey:@"unprocessedSubscription"];
[[NSUserDefaults standardUserDefaults]synchronize];
}
}];
。
它第一次正确添加,但第二次抛出错误:
'NSInternalInconsistencyException',原因:' - [__ NSCFArray insertObject:atIndex:]:发送到不可变对象的mutating方法
代码为:
{{1}}
答案 0 :(得分:2)
复制返回NSMutableArray的NSArray
NSArray *unprocessedSubscription=[[NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"];
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:unprocessedSubscription]
答案 1 :(得分:0)
基本上返回的值是不可变的,你可以做的是每次都创建一个可变数组,如果NSUserDefaults
中已经保存了值,则添加对象。
NSMutableArray *unprocessedSubscription=[[NSMutableArray alloc]init];
NSArray * storedValues = [NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"];
if(storedValues != nil){
[unprocessedSubscription addObjectsFromArray:storedValues];
}
NSString * subscriptionToAdd=@"something";
[unprocessedSubscription addObject:subscriptionToAdd];
[[NSUserDefaults standardUserDefaults]setObject:unprocessedSubscription forKey:@"unprocessedSubscription"];
[[NSUserDefaults standardUserDefaults]synchronize];
答案 2 :(得分:0)
您可以替换
NSMutableArray *unprocessedSubscription=[[NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"];
到
NSMutableArray *unprocessedSubscription=[[[NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"] mutableCopy];