2013-06-28 25 views
1

多线程绝对是一件棘手的事情。IOS:在多线程CoreData实现中删除一个永久存储器

我有一个主线程(AppDelegate),然后我的应用程序开始发送其他几个请求来根据某些用户操作同步一些数据。数据读取并修改CoreData。正如苹果所说,每个线程都会创建一个托管对象连接文本。

问题是,“重置数据库功能”。那只会删除本地存储的所有数据。

我这样做,通过在的AppDelegate像这样除去持久性存储:

- (bool) resetCoreData 
{ 

    //Remove the persistent Store. 
    NSError *error; 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"insight.sqlite"]; 
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]; 

    //Borrar los conextos para que el APP lo cree despues 
    for (NSManagedObject *ct in [self.managedObjectContext registeredObjects]) { 
     [self.managedObjectContext deleteObject:ct]; 
    } 



    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 

          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 

          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

    //Make new persistent store for future saves 
    if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { 
     // TODO: handling 
    } 

    return true; 

} 

然后,如果尝试从其他线程获取数据:

*** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x1edba090 <x-coredata://5EAC46F6-54DA-480B-9B15-CB28248FD1CE/PlanResults/p7>'' 

的思考?

回答

1

在删除NSPersistentStoreCoordinator对象之前,您需要释放所有的NSManagedObjectContext对象。这需要发生在所有线程中的所有NSManagedObjectContext对象中。 NSManagedObjectContext对象具有persistentStoreCoordinator属性。

删除NSPersistentStoreCoordinator文件后,您可以重新创建NSManagedObjectContext对象。

+0

谢谢你的回答bbarnhart。我使用ARC。 MOC正在每个线程(一个指针和一个alloc)开始时被创建。据我了解,只要线程结束,这些对象就会被终止。我也试着明确地将MOC设置为零和每个线程的结束,但它没有效果。此外,我没有删除协调员,我删除了PersistentStorage。我也尝试迭代所有实体并手动删除。同样的崩溃。 – user1444387

+0

在上面的代码中,您正在删除文件存储,然后尝试删除对象。那是一个问题。 – bbarnhart