ios - 父/子托管对象上下文究竟是如何工作的?

标签 ios core-data concurrency merge nsmanagedobjectcontext

我的应用程序会定期为我坚持使用的对象请求更新 Core Data到网络服务。然后我需要更新我在主要上下文中拥有的对象(默认情况下 AppDelegate 中提供的对象)。编辑对象的不是用户,所以我需要避免阻塞 UI,此外 我不只是修改对象信息,而是在需要时删除和添加新对象 .

似乎有两个选项可以执行 NSManagedObject 的更新。对象:在私有(private)队列中创建一个“兄弟”上下文,并创建一个子上下文。阅读了几篇帖子,有更多人说最好使用父/子上下文(如果我错了,请纠正我),但我并不完全理解它是如何工作的。我对父/子上下文有一些疑问:

  • 子上下文可以在私有(private)队列中,而父上下文可以在主队列中吗?
  • 我在某处读过一些关于设置合并策略的内容,但我没有找到它的使用示例,也许在使用父/子上下文时不需要设置合并策略?什么时候设置?在哪里可以找到示例或教程?
  • 如果我将私有(private)上下文设置为主上下文的子上下文,并保存子私有(private)上下文,那么私有(private)上下文中的对象是否会根据需要“替换”主上下文中的对象? (包括删除不再存在于私有(private)上下文和新上下文中的对象)......我的意思是......整个子上下文是否替换了整个父上下文?
  • 保存私有(private)上下文而不是主上下文的子上下文,然后清除并重新获取主上下文中的所有新数据会更好吗?

  • 我真的需要这个问题的帮助,在此先感谢。

    最佳答案

  • 是的, child 可以在私有(private)队列中,而 parent 可以在主队列中,相反的方式也是有效的。
  • 合并策略...

  • You use a merge policy object to resolve conflicts between the persistent store and in-memory versions of managed objects.



    因此,当您有多个直接来自persistentStoreCoordinator 的上下文时,您最常使用它,可能是一种私有(private)队列类型和一种主队列类型。

    合并策略影响调用结果
    - (void)mergeChangesFromContextDidSaveNotification:(NSNotification *)notification
    因此,如果您的删除操作是在专用队列中完成然后保存的,您可以通过调用 mergeChanges... 在 UI 中反射(reflect)该更改。在您的 Main 上下文中,使用通知对象NSManagedObjectContextDidSaveNotification Private 上下文中的保存将创建。
  • 父上下文不会被替换。简单地说,在子节点中所做的更改会覆盖在父节点上。因此,在您的情况下,删除子对象中的对象会导致该对象在您保存子对象后被删除。
  • 不,如果您不想使用父子上下文,最好执行 2 中描述的操作。您所描述的是丢弃当前的主要上下文并创建一个新的上下文以反射(reflect) PSC 的新状态。它并不糟糕,但它很昂贵,如果您的 UI 与托管对象有任何紧密绑定(bind),您需要确保这些对象也被重置。它更便宜只是合并保存。

  • 使用 mergeChangesFromContextDidSaveNotification: has been measured比 parent->child 更快地进行更改传播,但您可能会发现 parent->child 在可读性方面更清晰。

    关于ios - 父/子托管对象上下文究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32540461/

    相关文章:

    ios - 如何在 ViewController 之间传递委托(delegate)

    objective-c - 在后台线程上执行时,CoreData 不处理删除

    java - 如何确保一个线程在另一个线程之前启动?

    ios - 代表客户端发布 iOS 应用到 App Store

    iphone - 在 iPad 上运行通用 iOS 应用程序会尝试调用仅限 iPhone 的类

    ios - 撕裂 coredata 堆栈可以解决模型更新问题吗?

    objective-c - 为核心数据获取提供随机排序

    c# - 为什么递减一个变量会修改 C# Parallel.ForEach 循环中另一个变量的递增?

    haskell - 在 Haskell 中测试异步异常下的正确性

    ios - 在 iphone 中从另一个安装/更新应用程序