2013-06-04 19 views
-1

我對異步UrlConnections有以下代碼。如果請求失敗, 我將NSString添加到保存在NSUserDefaults中的NSMutableArray。 第一次它正確添加,但第二次它拋出一個錯誤:在異步UrlConnections中使用NSUserDefaults的意外行爲

'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object

的代碼是:

[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 * [email protected]"something"; 
      [unprocessedSubscription addObject:subscriptionToAdd]; 
      [[NSUserDefaults standardUserDefaults]setObject:unprocessedSubscription forKey:@"unprocessedSubscription"]; 
      [[NSUserDefaults standardUserDefaults]synchronize]; 
     } 
    }]; 
+0

爲什麼不合理?我是這個網站的新手,在這裏發佈問題,請給我理由,讓我可以改進提問。 – user2412870

回答

2

複製的NSArray返回給一個的NSMutableArray

NSArray *unprocessedSubscription=[[NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"]; 

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:unprocessedSubscription] 
+1

演員陣容不會有任何影響。 – omz

+1

沒有工作人 – user2412870

+0

我只是編輯它,它現在應該工作 –

0

基本上返回的值是不可變的,你可以做的是每次創建一個可變數組,並添加對象如果有ar e已經保存了NSUserDefaults的值。

NSMutableArray *unprocessedSubscription=[[NSMutableArray alloc]init]; 
NSArray * storedValues = [NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"]; 
if(storedValues != nil){ 
[unprocessedSubscription addObjectsFromArray:storedValues]; 
} 
NSString * [email protected]"something"; 
[unprocessedSubscription addObject:subscriptionToAdd]; 
[[NSUserDefaults standardUserDefaults]setObject:unprocessedSubscription forKey:@"unprocessedSubscription"]; 
[[NSUserDefaults standardUserDefaults]synchronize]; 
0

您可以取代你

NSMutableArray *unprocessedSubscription=[[NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"]; 

NSMutableArray *unprocessedSubscription=[[[NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"] mutableCopy];