繁体   English   中英

iPhone-解析NSMutableArray以删除对象

[英]iPhone - Parsing an NSMutableArray to remove objects

我有一个对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;
}

如何在不发生冲突的情况下从该数组添加/删除内容?
我不确定原因是许多使用默认值的对象导致此崩溃。 我也怀疑这是我解析数组的方式。

我需要保留我的对象实例,并使它们并行运行。

快速枚举数组时,切勿更改数组。 它将为您造成异常。 您可以使用来获得满足您条件的物品

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

您可以尝试同步处理NSUSerDefaults数组中的添加/删除

        // ==========================================================================================================
    - (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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM