• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 06:46:14 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

- (void) setupCoreDataStack
{
    self.managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSBundle allBundles]];
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];

    NSURL *url = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent"Model.sqlite"];

    NSDictionary *options = @{NSPersistentStoreFileProtectionKey: NSFileProtectionComplete,
                              NSMigratePersistentStoresAutomaticallyOptionYES};
    NSError *error = nil;
    NSPersistentStore *store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url optionsptions error:&error];
    if (!store)
    {
        NSError *deleteError = nil;
        if ([[NSFileManager defaultManager] removeItemAtURL:url error:&deleteError])
        {
            error = nil;
            store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url optionsptions error:&error];
        }

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

    self.mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    self.mainManagedObjectContext.persistentStoreCoordinator = psc;
}

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

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
                                         (unsigned long)NULL), ^(void)
{
    //Create private context and lnk to main context..
    NSManagedObjectContext* privateContext = [[NSManagedObjectContext alloc] 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 (![privateContext save:&error])
            abort();

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

            NSError *mainError;
            if (![self.mainManagedObjectContext save:&mainError])
                abort();
        }];
    }];
});

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

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

感谢您的意见, /马库斯



Best Answer-推荐答案


通常你想在主 NSManagedObjectContext 上设置合并策略。但是我的第一个问题是,您是否遇到合并冲突?如果您没有得到任何内容,那么您是否需要更改合并策略?

我倾向于保留默认策略(合并错误),直到我真正遇到合并问题。否则,当您没有意识到存在合并情况时,您可能会通过合并工作来掩盖问题。

关于ios - 多线程 CoreData 应用程序中主上下文和私有(private)上下文的推荐合并策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22037206/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap