菜鸟教程小白 发表于 2022-12-12 15:00:06

ios - 核心数据设置多个 managedObjectContexts


                                            <p><p>在我正在开发的应用程序中,我需要同时访问和写入 Core Data。我已经能够收集到这意味着我需要使用多个 managedObjectContexts,但我不明白我应该如何设置这两个 managedObjectContexts。 </p>

<p>我知道,一旦我设置好它们,我需要在后台线程上对其 managedObjectContext 执行写操作,然后通过如下操作合并数据:<a href="https://stackoverflow.com/questions/7540801/core-data-and-threads-grand-central-dispatch/7545514#7545514" rel="noreferrer noopener nofollow">Core Data and threads / Grand Central Dispatch</a> . </p>

<p>所以我的问题是,我将如何启动两个单独的 managedObjectContexts 以便我可以按照描述使用它们?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您必须像这样使用相同的 <code>NSPersistentStoreCoordinator</code> 创建两个单独的 <code>NSManagedObjectContexts</code>,</p>

<p>首先在你的模型类中创建两个 <code>NSManagedObjectContexts</code> 名称分别为 <code>backgroundManagedObjectContext</code> 和 <code>mainBackgroundManagedObjectContext</code></p>

<pre><code>+ (NSManagedObjectContext *)backgroundManagedObjectContext
    {
      static NSManagedObjectContext * backgroundManagedObjectContext;
      if(backgroundManagedObjectContext != nil){
            return backgroundManagedObjectContext;
      }
      @try {
            NSPersistentStoreCoordinator *coordinator = ;
            if (coordinator != nil) {
                backgroundManagedObjectContext = [ initWithConcurrencyType:NSPrivateQueueConcurrencyType];
                ];
            }
      }
      @catch (NSException *exception) {
            NSLog(@&#34;Exception occur %@&#34;,exception);
      }
      return backgroundManagedObjectContext;

    }
</code></pre>

<p>那么两者都需要获得相同的 <code>persistentStoreCoordinator</code>
然后需要将您的 <code>backgroungManagedObjectContext</code> 合并到 <code>mainBackgroundManagedObjectContext</code>,这样每当您像这样将数据保存到 <code>backgroundManageObjectContext</code> 时都会创建 <code>NSNotification</code> </p>

<pre><code>[ addObserver:self
                                             selector:@selector(contextDidSave:)
                                                 name:NSManagedObjectContextDidSaveNotification
                                             object:nil];
</code></pre>

<p>那么你必须实现这个通知方法来更新你的 <code>mainManagedObjectContext</code> 像这样</p>

<pre><code>- (void)contextDidSave:(NSNotification *)notification
    {
      SEL selector = @selector(mergeChangesFromContextDidSaveNotification:);
      [ performSelectorOnMainThread:selector withObject:notification waitUntilDone:YES];

    }
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 核心数据设置多个 managedObjectContexts,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/19107822/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/19107822/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 核心数据设置多个 managedObjectContexts