使用NSUserDefaults与异步UrlConnections的意外行为

时间:2013-06-04 11:01:30

标签: ios objective-c asynchronous nsuserdefaults

我有一个异步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}}

3 个答案:

答案 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];