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

时间:2016-07-18 10:14:34

标签: ios objective-c iphone core-data

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'而终止应用程序,原因:'* 集合&lt; __ NSCFSet:0x15fad880&gt;在被列举时被突变。在这一行:

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

我已经在线搜索,我发现很多东西,但没有任何帮助我。当我运行它时,没有Core Data被更改的地方,或者联系实体。这样做很奇怪。

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

中的所有内容

请,任何帮助。告诉我是否需要更多信息。

1 个答案:

答案 0 :(得分: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
}
}

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