何时以及为什么要使用多个NSManagedObjectContext?

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

  1. 当我应该使用多个NSManagedObjectContext?
  2. 我听说在某些情况下我应该使用3个moc,但是我不知道应该使用3个moc的情况吗?

通常情况下,您要为将访问Core Data数据库的每个线程使用单独的NSManagedObjectContext 。 这是为了防止对象graphics由于并发写入相同的上下文而潜在地进入不一致的状态。

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

NSManagedObjectContexttypes的AppDelegate中创build一个属性,并重写getter以为每个调用线程返回一个新的上下文。 通过利用每个线程的threadDictionary来做到这一点。

首先,像平常一样设置你的managedObjectModel和persistentStoreCoordinator。 然后在你的AppDelegate中创build你的上下文并分配给你的属性:

 self.managedObjectContext = [[NSManagedObjectContext alloc] init]; self.managedObjectContext.persistentStoreCoordinator = self.storeCoordinator; 

在您的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; } } 

现在,在您访问AppDelegate的managedObjectContext属性的代码中的任何地方,都将确保线程安全。

以下链接清楚地说明了何时,为什么以及如何使用多个托pipe对象上下文。

http://www.cocoanetics.com/2012/07/multi-context-coredata/

以下是使用多个托pipe对象上下文的两个主要原因。

  • 为了使NSManagedObjectContext线程安全,因为NSManagedObjectContext不是线程安全的。
  • lockingNSManagedObjectContext以在UI上显示数据。 这意味着,当你在UI上显示数据,并从服务器获取数据时,我们应该获取子NSManagedObjectContext上的数据,以避免并发和UI阻塞问题。