核心数据在枚举时发生了变异
我对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 } }
如果这不能解决您的问题,可能会检查您的方法是否被多次调用。