gpt4 book ai didi

iphone - 使用 NSFetchedResultsController 处理背景变化

转载 作者:行者123 更新时间:2023-12-03 16:16:11 27 4
gpt4 key购买 nike

我在 NSFetchedResultsController 和 CoreData 方面遇到了一些棘手的问题,如果能获得帮助,我将非常感激。

问题 1 - 更新:我在后台线程上更新我的商店,这导致某些行被删除、插入或更新。使用“mergeChangesFromContextDidSaveNotification:”方法将更改合并到主线程上的上下文中。插入和删除已正确更新,但更新未正确更新(例如,单元格标签未随更改而更新),尽管我已确认更新通过 contextDidSaveNotifcation 进行,与插入和删除完全相同。我当前的解决方法是暂时将上下文的陈旧间隔更改为 0,但这似乎不是理想的解决方案。

问题 2 - 删除对象:我的获取批量大小为 20。如果后台线程删除了前 20 行中的对象,则一切正常。但是,如果该对象位于前 20 行之后并且表格向下滚动,则会引发“CoreData 无法完成故障”错误。我尝试重新保存上下文并重新执行 frc 获取 - 一切都无济于事。注意:在这种情况下,不会调用 frc 委托(delegate)方法“didChangeObject....”进行删除 - 我认为这是因为当时没有出现问题的对象(因为它超出了初始获取范围) )。但由于某种原因,上下文仍然认为该对象在附近,尽管该对象已从存储中删除。

问题 3 - 删除节:当删除一行导致删除节时,我得到了“节中行数无效???”错误。我通过从 NSFetchedResultsChangeMove: 部分中删除“reloadSection”行并将其替换为“[tableView insertRowsAtIndexPaths...”来解决此问题,这似乎有效,但我再次不确定这是否是最佳解决方案。

任何帮助将不胜感激。谢谢!

最佳答案

我认为您的所有问题都与获取结果 Controller 的缓存有关。

问题 1 是由 FRC 使用缓存对象(其 ID 未更改)引起的。当您添加或删除对象时,会更改 ID 并强制更新缓存,但更改对象的属性却不会可靠地这样做。

问题2是由FRC检查缓存中的对象引起的。最有可能的是,该对象具有在缓存中持久存在的无故障关系。当您在后台删除它时,FRC 会尝试在关系另一端的对象中出错,但不能。

问题 3:同样的问题。缓存不反射(reflect)更改。

当 FRC 以外的某个对象正在修改数据模型时,您确实不应该使用 FRC 的缓存。您有两个选择:

  1. (首选)不使用缓存。创建 FRC 时将缓存属性设置为 nil。
  2. 只要后台进程更改数据模型,就清除缓存。

当然,这两个首先就违背了使用缓存的目的。

只有当数据大部分是静态的和/或 FRC 管理更改时,缓存才有用。在任何其他情况下,您都不应该使用它,因为 FRC 需要反复检查实际数据模型以确保它对数据有最新的理解。它不能依赖于它存储的对象副本,因为另一个输入可能已经更改了真实对象。

关于iphone - 使用 NSFetchedResultsController 处理背景变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2989910/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com