【问题标题】:Order of NSFetchedResultController delegates didChange: atSectionIndex:NSFetchedResultController 委托的顺序 didChange: atSectionIndex:
【发布时间】:2021-10-30 09:31:17
【问题描述】:

我的情况很奇怪,我问自己是不是做错了什么。我有一个 NSFetchedResultsController 和一个分配的委托。委托接收到已正确添加部分的函数调用,但消息的顺序似乎未定义。

    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>,
                    didChange sectionInfo: NSFetchedResultsSectionInfo,
                    atSectionIndex sectionIndex: Int,
                    for type: NSFetchedResultsChangeType) 

假设我最初的提取结果是 3 个部分 [0,1,2]。现在我收到了有关更改的更新,如下所示:

  • .为 sectionIndex 4 插入操作
  • .为 sectionIndex 3 插入操作

我正在尝试根据更改跟踪视图模型,所以我不知道我需要在这里做什么。如何在添加第 3 节之前添加第 4 节。问题是,如果我只添加一个占位符第 3 节,然后添加第 4 节4.

文档中提到了订单,但我希望更新是有序的,以便我可以跟踪对本地数组的更改。

感谢任何提示。

【问题讨论】:

    标签: ios core-data nsfetchedresultscontroller


    【解决方案1】:

    NSFetchedResultsController 专为驱动UITableView 的数据源而设计/实现/测试。来自文档:

    While table views can be used in several ways, fetched results controllers primarily assist you with a primary list view.
    

    为了回答您的问题,我认为您没有做错任何事情,但我认为您正试图在 UITableView 的实现中对一些秘密进行逆向工程。

    【讨论】:

    • 可能你是对的。仍然很不幸,因为在 NSFetchedResultsController 驱动的 SwiftUI 视图模型中有很多用途。
    【解决方案2】:

    有趣的问题。我在文档中看不到有关操作顺序的任何内容,因此我们必须假定无法保证。但是根据NSFetchedResultsControllerDelegate 的文档,实现controllerDidChangeContent(_:),然后重新加载表,看起来像是要走的路,而不是使用controller(:didChange:atSectionIndex:for:)。或者,如果您确实想继续捕获每个部分插入,请将这些更改批量处理,直到您收到 didChangeContent() 调用。

    【讨论】:

    • 问题仍然是 tableView 将如何知道在我的示例中该做什么结果可能是:[0,1,2,3,4][0,1,2,3,3',4]。如果无法保证顺序,除非您等到didChange 通知并再次从头开始查询当前状态,否则您如何知道何时必须插入新部分。
    • 收听各个部分的更新,并跟踪您需要做什么。将 UI 更新推迟到 didChange。这闻起来可能是过早的优化,顺便说一句:如果您从头开始查询状态,性能是否无法接受?
    • 不幸的是,我这样做的全部原因是因为性能不可接受。我的用例是后台进程触发许多save() 事件,我不想一直触发所有内容的更新。无论如何,谢谢你的想法。
    • 您可能已经尝试过了,但我建议使用中间 ManagedObjectContext 来捕获所有后台进程的save() 事件并定期将它们合并到视图的 MOC。并查看 Xcode Core Data 启动参数可用的日志记录。一种完全不同的方法是批量插入/更新 (developer.apple.com/documentation/coredata/batch_processing)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多