多线程绝对是一件棘手的事情。
我有一个主线程(AppDelegate),然后我的应用程序开始发送其他几个请求以根据一些用户操作同步一些数据。数据读取和修改CoreData。正如 Apple 所说,正在每个线程中创建一个 Managed Object Conext。
问题是“重置数据库功能”。那个会简单地删除本地存储的所有数据。
我这样做是通过删除AppDelegate中的 Persistent Store 来实现的,如下所示:
- (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>''
想法?