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

Ios 何时以及为什么使用多个NSManagedObjectContext?,ios,core-data,Ios,Core Data,基本上,我在我的应用程序中只使用了一个moc,但我认为在某些情况下应该使用多个NSManagedObjectContext 何时应使用多个NSManagedObjectContext 我听说在某些情况下我应该使用3MOC,但我不知道在哪些情况下我应该使用3MOC 对不同的线程使用不同的“moc” 通常,您希望为访问核心数据数据库的每个线程使用一个单独的NSManagedObjectContext。这是为了防止对象图由于并发写入同一上下文而可能进入不一致状态 处理此问题的最简单方法是为每个线程创建

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

  • 何时应使用多个NSManagedObjectContext
  • 我听说在某些情况下我应该使用3MOC,但我不知道在哪些情况下我应该使用3MOC
  • 对不同的线程使用不同的“moc”


    通常,您希望为访问核心数据数据库的每个线程使用一个单独的
    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
      不是线程安全的
    • 锁定
      NSManagedObjectContext
      以在UI上显示数据。这意味着,当您在UI上显示数据并从服务器获取数据时,我们应该在子
      NSManagedObjectContext
      上获取数据,以避免并发和UI阻塞问题
    对于“工作统一”企业模式,也就是说,您可以回滚多个机会,只要它们没有保存(然后合并回主上下文)


    ofc还用于后台更新等

    我能想到的唯一原因是,如果您有不同的数据集,您可能希望独立访问。为每个NSThread单独维护“MOC_KEY”的最佳方法是什么?@ParthAdroja,我也有同样的困惑。但是您可以看到“threadDictionary”是一个对象属性。这意味着它对于每个线程都是独立的。因此,您可以在每个线程的字典中使用相同的键保存MOC