何时以及为什么要使用多个NSManagedObjectContext?
基本上,我只在应用程序中使用了一个moc,但是我认为在某些情况下我应该使用多个NSManagedObjectContext。
- 当我应该使用多个NSManagedObjectContext?
- 我听说在某些情况下我应该使用3个moc,但是我不知道应该使用3个moc的情况吗?
通常情况下,您要为将访问Core Data数据库的每个线程使用单独的NSManagedObjectContext
。 这是为了防止对象graphics由于并发写入相同的上下文而潜在地进入不一致的状态。
处理这个问题最简单的方法是为每个线程创build一个新的NSManagedObjectContext
并共享一个NSPersistentStoreCoordinator
。
在NSManagedObjectContext
types的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对象上下文。
以下是使用多个托pipe对象上下文的两个主要原因。
- 为了使
NSManagedObjectContext
线程安全,因为NSManagedObjectContext
不是线程安全的。 - locking
NSManagedObjectContext
以在UI上显示数据。 这意味着,当你在UI上显示数据,并从服务器获取数据时,我们应该获取子NSManagedObjectContext
上的数据,以避免并发和UI阻塞问题。
- 增加关系到仅更新的产品核心数据
- CoreData:警告:无法为实体“Readings”加载名为“WEEReadings”的类。 找不到类,使用默认的NSManagedObject来代替
- 在核心数据中build模树结构
- 如何浏览在我的iPhone上运行的应用程序中的核心数据?
- sorting核心数据实体的最佳方法是什么?
- NSPersistentStoreCoordinator在ios iOS中没有永久存储(模式不匹配或迁移失败)核心数据
- 通过NSManagedObjectSubclass上的Swift Computed属性对NSFetchedResultsController进行sorting
- 在iOS上存储对象 – 最佳解决scheme?
- RESTKit:在覆盖之前比较GET对象和本地持久化