核心数据在枚举时发生了变异

我对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但它崩溃并出现错误:

*由于未捕获的exception’NSGenericException’终止应用程序,原因:’* Collection 在被枚举时被突变。在此行:

  NSArray *contactObjArray = [context executeFetchRequest:fetchRequest error:&error]; 

我在网上搜索,发现很多东西,但没有什么可以帮助我。 当我运行它时,没有Core Data被更改的地方,或联系实体。 这样做的错误非常奇怪。

如果我在主线程中运行它我没有错误/没有崩溃,但如果应用程序在那段时间退出(执行时)我丢失了Contact所有内容

请帮忙。 告诉我是否需要更多信息。

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

这也可能是你正在做的循环的原因,你在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 } } 

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