何时以及为何使用多个NSManagedObjectContext?

NOr*_*der 9 core-data ios

基本上,我只在我的应用程序中使用了一个moc,但我认为在某些情况下我应该使用多个NSManagedObjectContext.

  1. 什么时候我应该使用多个NSManagedObjectContext?
  2. 我听说在某些情况下我应该使用3 moc,但我不知道哪些情况我应该使用3 moc?

小智 15

通常,您希望为NSManagedObjectContext将访问Core Data数据库的每个线程使用单独的.这是为了防止对象图由于对同一上下文的并发写入而可能进入不一致状态.

处理此问题的最简单方法是NSManagedObjectContext为每个线程创建一个新的并共享一个NSPersistentStoreCoordinator.

在类型的AppDelegate中创建属性NSManagedObjectContext并覆盖getter以返回每个调用线程的新上下文.通过利用threadDictionary每个线程来做到这一点.

首先,像往常一样设置managedObjectModel和persistentStoreCoordinator.然后在AppDelegate中创建上下文并分配给您的属性:

self.managedObjectContext = [[NSManagedObjectContext alloc] init];
self.managedObjectContext.persistentStoreCoordinator = self.storeCoordinator;
Run Code Online (Sandbox Code Playgroud)

在您的managedObjectContext getter覆盖中,使用以下代码为每个调用线程返回单独的上下文:

- (NSManagedObjectContext *) managedObjectContext
{
    NSThread *thisThread = [NSThread currentThread];
    if (thisThread == [NSThread mainThread])
    {
        //For the Main thread just return default context iVar      
        return _managedObjectContext;
    }
    else
    {
        //Return separate MOC for each new thread        
        NSManagedObjectContext *threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:@"MOC_KEY"];
        if (threadManagedObjectContext == nil)
        {
            threadManagedObjectContext = [[[NSManagedObjectContext alloc] init];
            [threadManagedObjectContext setPersistentStoreCoordinator: [self storeCoordinator]];
            [[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:@"MOC_KEY"];

        }

        return threadManagedObjectContext;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在代码中访问AppDelegate的managedObjectContext属性的任何位置,您将确保线程安全.