菜鸟教程小白 发表于 2022-12-13 06:46:14

ios - 多线程 CoreData 应用程序中主上下文和私有(private)上下文的推荐合并策略


                                            <p><p>我已阅读并尝试了解这样做的推荐做法,但我想就以下情况听取您的专家意见;</p>

<p>我使用 CoreData 并将主上下文分配给持久存储协调器。</p>

<pre><code>- (void) setupCoreDataStack
{
    self.managedObjectModel = ];
    NSPersistentStoreCoordinator *psc = [ initWithManagedObjectModel:self.managedObjectModel];

    NSURL *url = [[[ URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@&#34;Model.sqlite&#34;];

    NSDictionary *options = @{NSPersistentStoreFileProtectionKey: NSFileProtectionComplete,
                              NSMigratePersistentStoresAutomaticallyOption:@YES};
    NSError *error = nil;
    NSPersistentStore *store = ;
    if (!store)
    {
      NSError *deleteError = nil;
      if ([ removeItemAtURL:url error:&amp;deleteError])
      {
            error = nil;
            store = ;
      }

      if (!store)
      {
            // Also inform the user...
            NSLog(@&#34;Failed to create persistent store. Error %@. Delete error %@&#34;,error,deleteError);
            abort();
      }
    }

    self.mainManagedObjectContext = [ initWithConcurrencyType:NSMainQueueConcurrencyType];
    self.mainManagedObjectContext.persistentStoreCoordinator = psc;
}
</code></pre>

<p>我所有的异步工作线程(与后端同步、执行各种 BLE/CoreBluetooth 事件等)创建自己的私有(private)上下文(从它们的异步调度线程中),然后使用 <em>performBlock</em> 执行在根据指南/建议最终保存私有(private)上下文和主要上下文之前工作;</p>

<pre><code>dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                       (unsigned long)NULL), ^(void)
{
    //Create private context and lnk to main context..
    NSManagedObjectContext* privateContext = [ initWithConcurrencyType:NSPrivateQueueConcurrencyType];

    //Link private context to main context...
    privateContext.parentContext = self.mainManagedObjectContext;

    //Perform login-mechanism in block
    [privateContext performBlock:^{

      //Do the work!
      ...
      ...

      //Merge changes to main context!
      NSError* error = nil;
      if (!)
            abort();

      //Save main context to persistent store coordinator
      [self.mainManagedObjectContext performBlockAndWait:^{

            NSError *mainError;
            if (!)
                abort();
      }];
    }];
});
</code></pre>

<p>我现在的问题是,合并策略在此设置中如何工作?当我为 mainContext 分配一个 mergePolicy 时,这是否适用于如何将更改从 mainContext 合并到 PSC,或者将私有(private)上下文合并到主上下文时?</p>

<p>我的理解是否正确,如果在此设置中使用 <em>NSMergeByPropertyObjectTrumpMergePolicy</em>,如果将其分配给私有(private)上下文,将确保私有(private)上下文更改合并到主上下文,并且在以下情况下将使用私有(private)对象有冲突吗?或者我是否也必须设置主上下文的 mergePolicy 才能工作?</p>

<p>感谢您的意见,
/马库斯</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>通常你想在主 <code>NSManagedObjectContext</code> 上设置合并策略。但是我的第一个问题是,您是否遇到合并冲突?如果您没有得到任何内容,那么您是否需要更改合并策略?</p>

<p>我倾向于保留默认策略(合并错误),直到我真正遇到合并问题。否则,当您没有意识到存在合并情况时,您可能会通过合并工作来掩盖问题。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 多线程 CoreData 应用程序中主上下文和私有(private)上下文的推荐合并策略,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/22037206/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/22037206/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 多线程 CoreData 应用程序中主上下文和私有(private)上下文的推荐合并策略