2011-06-25 9 views
1

私はUserDefaultsで動作するオブジェクトを持っています。 Arrayにあるものをuserdefaultsに追加し、イベントが発生したときに削除します。 そのオブジェクトは複数のインスタンスを持つことができます。iPhone - NSMutableArrayを解析してオブジェクトを削除する

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSCFArray: 0x66061e0> was mutated while being enumerated.<CFArray 0x66061e0 [0xe38400]>{type = mutable-small, count = 3, values = (

私はこのような私の項目を削除します:

// ========================================================================================================== 
- (void) deleteSavedItem:(NSString*)keycodeToDelete 
// ========================================================================================================== 
{ 
    NSMutableArray* savedItems = [[self loadAllSavedItems] mutableCopy]; 

    for (NSDictionary* dict in savedItems) { 
     NSString* keycode = [dict objectForKey:@"keycode"]; 
     if ([keycode isEqualToString:keycodeToDelete]) 
      [savedItems removeObject:dict]; 
    } 

    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setValue:savedItems forKey:@"savedItems"]; 
    [defaults synchronize]; 

    [savedItems release]; 
} 

// ========================================================================================================== 
- (NSArray*) loadAllSavedItems 
// ========================================================================================================== 
{ 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
    NSArray* savedItems = [defaults arrayForKey:@"savedItems"]; 
    if (savedItems == nil) savedItems = [NSArray array]; 
    return savedItems; 
} 

は、どのように私は、その配列から物事を追加/削除することができるさまざまなオブジェクトのインスタンスから来る

これらの呼び出しが衝突し、衝突を生成するようです衝突することなく?
このクラッシュの原因となるデフォルトを使用する多くのオブジェクトが原因であるかどうかはわかりません。私はこれが私が配列を解析する方法であると考えています。

私は自分のオブジェクトのインスタンスを保持し、プロセスのパラレルを実行しておく必要があります。

答えて

3

から削除/追加をsynchonizing試みることができます。それはあなたと同じように例外を発生させます。あなたは

NSArray * matchingItems = [savedItems filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@" keycode MATCHES[cd] %@ ", keycodeToDelete]]; 

を使用して、条件を満たした後、使用してそれらを削除する項目、

[savedItems removeObjectsInArray:matchingItems]; 

deleteSavedItem:を修正は次のようになり得ることができます。

+0

本当ですか?私の配列にはNSDictionaryオブジェクトが含まれています。キーコードは、キーが「キーコード」であるアイテムの値です。 – Oliver

+0

@Oliver私は確信しています。私はそれがうまくいくようにキーパスを提供しています。あなたは辞書でそれを行うことができます。あなたはそれをテストすることができるはずです。 –

+0

私はお試しください。配列が.keycode属性を持つカスタムクラスinsatncesの配列だった場合、これを行う方法は何かを聞かせてもらえますか? – Oliver

0

あなたは速い、それを列挙しながら、あなたは、配列を変更してはなりませんNSUSerDefaults配列

0
 // ========================================================================================================== 
    - (void) deleteSavedItem:(NSString*)keycodeToDelete 
     // ========================================================================================================== 
    { 
     NSMutableArray* savedItems = [self loadAllSavedItems]; 

     for (NSDictionary* dict in savedItems) { 
      NSString* keycode = [dict objectForKey:@"keycode"]; 
      if ([keycode isEqualToString:keycodeToDelete]) 
       [savedItems removeObject:dict]; 
     } 

     NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
     [defaults setValue:savedItems forKey:@"savedItems"]; 
     [defaults synchronize]; 

     [savedItems release]; 
    } 

     // ========================================================================================================== 
    - (NSMutableArray*) loadAllSavedItems 
     // ========================================================================================================== 
    { 
     NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
     NSMutableArray* savedItems = [defaults arrayForKey:@"savedItems"]; 
     if (savedItems == nil) savedItems = [[NSMutableArray alloc]init]; 
     return savedItems; 
    } 
+0

enumurateはNSArray.soを変更していますが、NSMutableArrayを使用してください。このNSMutableArrayは変更可能であり、あなたに役立ちます。 –

関連する問題