-1

非同期 UrlConnections の次のコードがあります。リクエストが失敗した場合は、 に保存されるNSStringa にa を追加します。最初は正しく追加されますが、2 回目はエラーがスローされます。NSMutableArrayNSUserDefaults

'NSInternalInconsistencyException'、理由: '-[__NSCFArray insertObject:atIndex:]: 変更メソッドが不変オブジェクトに送信されました

コードは次のとおりです。

[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];
        }
    }];
4

3 に答える 3

2

返された NSArray を NSMutableArray にコピーします

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

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:unprocessedSubscription]
于 2013-06-04T11:04:13.543 に答える
0

あなたはあなたを置き換えることができます

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

NSMutableArray *unprocessedSubscription=[[[NSUserDefaults standardUserDefaults]objectForKey:@"unprocessedSubscription"] mutableCopy];
于 2013-06-04T11:13:15.993 に答える
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];
于 2013-06-04T11:08:20.043 に答える