如何同时使用 NSFetchedResultsController 和 UISearchController?

Posted

技术标签:

【中文标题】如何同时使用 NSFetchedResultsController 和 UISearchController?【英文标题】:How to use NSFetchedResultsController and UISearchController together? 【发布时间】:2015-02-21 07:00:25 【问题描述】:

我有一个包含 tableView 的视图。我正在使用 NSFetchedResultsController 来显示来自 Core Data 的结果。

我想添加一个 UISearchController(不是 UISearchDisplayController,因为它在 ios 8 中已被弃用)但我不知道如何链接它们。

我应该只有一个NSFetchedResultsController 还是两个? 我想有一种方法可以使用NSFetchedResultsController 获取所有数据,然后根据UISearchController 对它们进行排序我错了吗?

感谢您在这方面给我的帮助。

【问题讨论】:

【参考方案1】:

一些想法......

当您为searchController 创建resultsController 时,您可以将您希望搜索的数据传递给它。如果您在主表中使用NSFetchedResultsController,则可以传递fetchedObjects 数组。然后,为了响应搜索文本的更改,您过滤数组(您可以使用谓词和filteredArrayUsingPredicate 来创建一个包含搜索结果的单独数组,或者您可以遍历数组来构建它)。此路由的缺点是(除非您手动实现)搜索结果不会被分成单独的部分,并且如果底层数据发生更改(例如在后台线程上),搜索结果也不会自动更新。

我猜你可能有第二个NSFetchedResultsController:这将有助于使用部分,并且可能允许自动更新结果(使用委托方法),例如,如果你的数据在后台更新。但我会担心它引入的复杂性。

如果您选择原位应用搜索(即指定resultsController = nil),另一种选择是使用搜索条件更新NSFetchedResultsController 本身(即修改基础谓词并重新执行提取) .这样,您的搜索表的外观和感觉与主表完全一样(包括部分,如果您使用它),但随着搜索条件变得更好,显示的行明显减少。此选项需要注意确保正确重建 FRC,如果您有大型数据集,则在性能方面可能无法接受。

【讨论】:

几个月后,我在这里实现了上面的第三个选项;代码更简洁,我不必在两个NSFetchedResultsControllers 之间切换。

以上是关于如何同时使用 NSFetchedResultsController 和 UISearchController?的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchedResultsController 仅按第一个排序描述符排序

NSFetchedResultsController 性能问题

NSFetchedResultsController - TableView 中的 UI 更新不完整

关系的 NSFetchedResultsController 委托回调

核心数据:NSFetchedResultsController 错误:尝试创建两个动画

更改 NSFetchedResultsController 的 Fetch Request 和重新加载表数据的方法