使用子/父 NSManagedObjectContext 时出现奇怪的行为

2024-03-25

我正在开发一个应用程序,我需要在后台线程上计算事物(多秒操作)并写入事物(与服务器同步数据)。

因此,我使用两个 NSManagedObjectContext (MOC),一个子对象和一个父对象,并且它们必须始终保持同步。为了确保它们同步,我总是编辑/添加数据到子 MOC,以便它通过以下模式推送到主 MOC:

[childMOC performBlock:^{

    MyObject *myObject = *create new object in childMOC*

    [childMOC save:&error];

    [mainMOC performBlock:^{
        [mainMOC save:&error];
        // Is this mandatory to make it work correctly?
        // [childMOC performBlock:^{
        //     [childMOC refreshObject:myObject mergeChanges:NO];
        // }];
    }];
}];

一段时间后,我似乎在后台上下文中有同一对象的两个版本,一个具有临时 ID,另一个具有永久 ID。如果我例如将子对象添加到“真实”对象中(通过将新的永久 ID 从主 MOC 传递到子 MOC) 当我在后台 MOC 中检索对象时,我没有看到这些对象,因为它是缓存的旧临时对象。

我已经看到上面的模式被大量使用,但奇怪的是没有人提到这个临时/永久 ID 问题。

  1. 在一个上下文中它可以是同一对象的两个版本,这感觉不太对劲。如果我将 NSManagedObjectID 传递给子 MOC 并检索它,子 MOC 是否应该更新我现有的对象而不是创建一个新对象并将我的旧临时对象保留为缓存的默认值?

  2. 我是否需要在创建对象的每个位置使用注释行?

  3. 或者也许它与 mergeChangesFromContextDidSaveNotification 一起使用,会产生相同的效果吗?


我的解决方案是:

1)使用后台MOC作为父MOC,使用主MOC作为子MOC。作为奖励,我不需要保存主 MOC 来获取永久 ID。

[DC.backgroundMOC performBlock:^{
    // Add, save and update managed objects
    [DC saveContext]; // The changes is being pushed to the main context
}];

2) 使用 NSManagedObjectContextDidSaveNotification 使主 MOC 保持最新(主 MOC 正在更新 UI)

- (void) backgroundMOCSaved:(NSNotification*)notification {
    [mainMOC performBlock:^{
        [mainMOC mergeChangesFromContextDidSaveNotification:notification];
    }];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用子/父 NSManagedObjectContext 时出现奇怪的行为 的相关文章

随机推荐