iPhone - парсинг NSMutableArray для удаления объектов - PullRequest
1 голос
/ 25 июня 2011

У меня есть объект, который действует на UserDefaults. Он добавляет вещи в массив в userdefaults, а затем удаляет его при возникновении некоторых событий. Этот объект может иметь более одного экземпляра.

Эти вызовы, поступающие от экземпляра различных объектов, похоже, сталкиваются и вызывают сбой:

*** 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;
}

Как я могу добавлять / удалять вещи из этого массива без коллизий?
Я не уверен, что причина в том, что многие объекты, которые используют значения по умолчанию, вызывают этот сбой. Я тоже подозреваю, что именно так я разбираю массив.

Мне нужно сохранять экземпляры своих объектов и поддерживать их выполнение процесса parralel.

Ответы [ 3 ]

3 голосов
/ 25 июня 2011

Вы никогда не должны изменять массив при быстром его перечислении.Это вызовет исключение, как и для вас.Вы можете получить предметы, которые удовлетворяют вашему состоянию, используя

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

, а затем удалить их, используя

[savedItems removeObjectsInArray:matchingItems];

Изменено deleteSavedItem: будет.

- (void)deleteSavedItem:(NSString *)keycodeToDelete {
    NSMutableArray * savedItems    = [[self loadAllSavedItems] mutableCopy];
    NSArray        * matchingItems = [savedItems filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@" keycode MATCHES[cd] %@ ", keycodeToDelete]];

    [savedItems removeObjectsInArray:matchingItems];

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

    [savedItems release];
}
0 голосов
/ 25 июня 2011
        // ==========================================================================================================
    - (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 голосов
/ 25 июня 2011

Вы можете попробовать синхронизировать добавление / удаление из массива NSUSerDefaults

...