【问题标题】:Core Data was mutated while being enumerated核心数据在被枚举时发生了变异
【发布时间】:2016-11-20 21:47:46
【问题描述】:

Core Data 有个烦人的问题。我的应用程序需要从 iPhone 获取联系人并将其保存在我的数据库中。我正在尝试在后台线程中执行此操作。

我使用上面的代码:

[self performSelectorInBackground:@selector(fetchingContact) withObject:nil];


    -(void)fetchingContact{
    // Some Code
    for (int i = 0; i < nPeople; i++)
    {
    //Some Code
        NSManagedObjectContext *context = [APP_DELEGATE managedObjectContext];
        ABRecordID recordID = ABRecordGetRecordID(person);
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:context];
        [fetchRequest setEntity:entity];
        NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(contactId = '%d')",recordID]];
        [fetchRequest setPredicate:predicate];
        NSError *error = nil;
//crash
        NSArray *contactObjArray = [context executeFetchRequest:fetchRequest error:&error];
//crash
        if (error) {}
        Contact *contacts;
        if (contactObjArray.count == 0) {
            contacts = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:context];
        }else {
            contacts = [contactObjArray objectAtIndex:0];
        }
    //Some Code
    }
    }

在 AppDelegate 中:

- (NSManagedObjectContext *)managedObjectContext
{
     NSLog(@"managedObjectContext");
    // Returns ;the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
     if (_managedObjectContext != nil) {
          return _managedObjectContext;
     }

     NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
     if (!coordinator) {
          return nil;
     }
     _managedObjectContext =  [[NSManagedObjectContext alloc]initWithConcurrencyType: NSMainQueueConcurrencyType];
     [_managedObjectContext setPersistentStoreCoordinator:coordinator];
     return _managedObjectContext;
}

在这里我尝试保存在我的Core Data 中,但它因错误而崩溃:

* 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“* 集合 <0x15fad880>

&amp;

标签: ios objective-c iphone core-data


【解决方案1】:

当您在尝试获取核心数据时修改核心数据时会发生此错误。

这也可能是您正在执行的循环的原因,您在进行其他检索之前在 coredata 中插入一个新对象而不保存。尝试保存您的 managedobjectcontext :

最喜欢的 我对 Core Data 有一个恼人的问题。我的应用程序需要从 iPhone 获取联系人并将其保存在我的数据库中。我正在尝试在后台线程中执行此操作。

我使用上面的代码:

[self performSelectorInBackground:@selector(fetchingContact) withObject:nil];


-(void)fetchingContact{
// Some Code
for (int i = 0; i < nPeople; i++)
{
//Some Code
    NSManagedObjectContext *context = [APP_DELEGATE managedObjectContext];
    ABRecordID recordID = ABRecordGetRecordID(person);
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(contactId = '%d')",recordID]];
    [fetchRequest setPredicate:predicate];
    NSError *error = nil;
    NSArray *contactObjArray = [context executeFetchRequest:fetchRequest error:&error];
    if (error) {}
    Contact *contacts;
    if (contactObjArray.count == 0) {
        contacts = [NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:context];
        [context save:&error];
    }else {
        contacts = [contactObjArray objectAtIndex:0];
    }
//Some Code
}
}

如果这不能解决您的问题,请检查您的方法是否被多次调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 2011-03-17
    • 2017-06-28
    • 1970-01-01
    • 2015-02-01
    • 2014-07-04
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多