Ios 何时以及为什么使用多个NSManagedObjectContext?
基本上,我在我的应用程序中只使用了一个moc,但我认为在某些情况下应该使用多个NSManagedObjectContextIos 何时以及为什么使用多个NSManagedObjectContext?,ios,core-data,Ios,Core Data,基本上,我在我的应用程序中只使用了一个moc,但我认为在某些情况下应该使用多个NSManagedObjectContext 何时应使用多个NSManagedObjectContext 我听说在某些情况下我应该使用3MOC,但我不知道在哪些情况下我应该使用3MOC 对不同的线程使用不同的“moc” 通常,您希望为访问核心数据数据库的每个线程使用一个单独的NSManagedObjectContext。这是为了防止对象图由于并发写入同一上下文而可能进入不一致状态 处理此问题的最简单方法是为每个线程创建
通常,您希望为访问核心数据数据库的每个线程使用一个单独的
NSManagedObjectContext
。这是为了防止对象图由于并发写入同一上下文而可能进入不一致状态
处理此问题的最简单方法是为每个线程创建一个新的NSManagedObjectContext
,并共享一个NSPersistentStoreCoordinator
在AppDelegate中创建类型为NSManagedObjectContext
的属性,并重写getter以为每个调用线程返回新上下文。通过使用每个线程的threadDictionary
执行此操作
首先,像平常一样设置managedObjectModel和persistentStoreCoordinator。然后在AppDelegate中创建上下文并分配给属性:
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属性的任何地方,都将确保线程安全。以下链接清楚地解释了何时、为什么以及如何使用多个托管对象上下文 以下是使用多托管对象上下文的两个主要原因
- 使
线程安全,因为NSManagedObjectContext
不是线程安全的NSManagedObjectContext
- 锁定
以在UI上显示数据。这意味着,当您在UI上显示数据并从服务器获取数据时,我们应该在子NSManagedObjectContext
上获取数据,以避免并发和UI阻塞问题NSManagedObjectContext
ofc还用于后台更新等我能想到的唯一原因是,如果您有不同的数据集,您可能希望独立访问。为每个NSThread单独维护“MOC_KEY”的最佳方法是什么?@ParthAdroja,我也有同样的困惑。但是您可以看到“threadDictionary”是一个对象属性。这意味着它对于每个线程都是独立的。因此,您可以在每个线程的字典中使用相同的键保存MOC