1

多线程绝对是一件棘手的事情。

我有一个主线程(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>''

想法?

4

1 回答 1

1

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

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

于 2013-06-28T12:04:41.277 回答