【问题标题】:Core Data with parentContext Collection <__NSCFSet: 0x169a2190> was mutated while being enumerated具有 parentContext 集合 <__NSCFSet: 0x169a2190> 的核心数据在枚举时发生了突变
【发布时间】:2015-11-13 03:26:09
【问题描述】:

我有以下问题:

  • 在我的应用中有一个核心数据模式,即根 NSManagedObjectContect 与 NSPrivateQueueConcurrencyType 并发类型,此上下文负责解析从远程服务器获取的对象。
  • 还有 NSManagedObjectContect 设置为具有 NSMainQueueConcurrencyType 并发类型的 root 的子节点。

问题是随机的,例如一些数据正在根上下文中解析,并且必须在主线程应用程序崩溃时刷新,信息 Collection <__nscfset:> 在枚举时发生了变异。 我做了研究,我知道通常这意味着来自根上下文的对象在线程 x 上发生突变,而在线程 y 上被枚举。我确信 99% 的人不是我的情况,因为我知道多线程环境和使用核心数据必须遵循的规则。我想知道它是否以这种方式工作:

  1. 根上下文进行一些解析。
  2. 在解析过程中,应用想要刷新 UI,并在主上下文中完成。
  3. 在刷新主上下文的操作期间,从父上下文中获取对象。
  4. 在执行获取的操作时,由于解析操作,根上下文会改变获取的对象。

不知道这样对不对? 您能否与我分享您对这个问题的看法?

【问题讨论】:

    标签: multithreading core-data


    【解决方案1】:

    看来您的设置并不理想。与其让主上下文的 父 上下文来完成工作并更改对象,不如让它成为 子 上下文。

    如果您遵循以下模式,则不会遇到此问题:

    Root context (background) saves to persistent store --> parent of
    Main context (main thread) updates UI --> parent of
    Worker context (background) handles web, parses, inserts, mutates etc.
    

    当您保存工作上下文时,更改会被推送到主上下文。例如,如果您使用NSFetchedResultsController,您可以通过实现委托方法来响应更改。

    【讨论】:

    • 感谢您的回复,我明白您的意思,但我所拥有的是:根上下文(背景)保存到持久存储-> 主上下文(主线程)的父级更新 UI--> 父级我的问题是 - 如果对根上下文进行解析操作,并且在此操作期间应用程序想要更新集合 A。集合 A 由主上下文(根上下文的子项)获取。在此获取过程中,根上下文会持续改变 Set A,并且由于此变异系统会引发帖子标题中的异常 - 有可能吗?
    • 这就是我要说的。不要解析根上下文,解析工作者上下文。仅保存到根上下文上的持久存储。
    • 好吧,这看起来很合理——我会尝试让你的模式适应应用程序。感谢您的帮助。
    猜你喜欢
    • 2017-06-28
    • 2015-05-23
    • 1970-01-01
    • 2012-07-30
    • 2011-03-17
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多