【问题标题】:When and how often to call processPendingChanges to ensure graph integrity何时以及多久调用一次 processPendingChanges 以确保图形完整性
【发布时间】:2011-04-18 21:49:41
【问题描述】:

我有一些由 Core Data 管理的实体,并且有几种情况,在一个方法中,我设置了一些属性值,这些属性值将导致 Core Data 将强制执行的图形更改并执行(逻辑上)依赖于最新状态的其他操作为图表。

是否有任何理由在每次设置关系后不调用processPendingChanges,以确保图表始终是最新的?当我这样做时,一切正常,但是,很明显,它有点“嘈杂”,并且打破了一些本来是通知的处理(例如,最终发送大量controllerWillChangeContent/controllerDidChangeContent的获取结果控制器否则会发生这种情况时向他们的代表发给他们)。

补充:

从对实体进行更改的任何方法返回后,图表是否总是最新的?

【问题讨论】:

    标签: core-data nsfetchedresultscontroller nsmanagedobjectcontext


    【解决方案1】:

    我发现在检查 NSManagedObjectContext 的已删除对象之前调用 processPendingChanges 很困难。至少如果某些关系将 deleteRule 设置为 NSCascadeDeleteRule。

    如果您不调用 processPendingChanges,则 deletedObjects 可能不包含将在当前事件结束时被级联删除的对象。

    【讨论】:

      【解决方案2】:

      processPendingChanges 最常用于 iOS 上,多个上下文在单独的线程上运行。它在 MacOS 下扮演着更大更常见的角色。

      在大多数情况下,您通常不必在 iOS 下调用它。这样做并没有真正给您带来太多优势,如果您有一个复杂的图形,它可能会在主线程上执行时导致 UI 滞后。

      除非测试表明您由于某种原因失去了图形完整性,否则我不会为此烦恼。

      【讨论】:

      • 问题是我需要先检查图中的关系,然后才能强制执行模型。
      • 当您设置关系时,由于 Key-Value-Observing,关系的双方都可以立即使用它。我见过很少的情况(在单个线程上)你必须做任何事情来更新对象图。除非您确定您在图形完整性方面遇到问题,否则我不会打扰。始终选择最简单的设计,然后仅在测试证明您需要时才增加复杂性。
      • 过早的优化是所有编程罪恶的根源。
      • 我之所以问,是因为我确实(不是假设地)需要先查看图表,然后才能处理一些刚刚进行的更改。所以问题仍然存在:将待处理更改的处理分解为对 processPendingChanges 的多次调用与通常让它们作为一组处理(这需要重新设计)是否有缺点?
      • processPendingChanges 可以触发一连串的副作用,所以如果您的图表很复杂并且有很多副作用,例如计算属性,然后每次调用都会冒着随机停止应用程序的风险。因此,我不建议每次都这样做。
      猜你喜欢
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多