如何同时使用 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,如果您有大型数据集,则在性能方面可能无法接受。
【讨论】:
几个月后,我在这里实现了上面的第三个选项;代码更简洁,我不必在两个NSFetchedResultsController
s 之间切换。以上是关于如何同时使用 NSFetchedResultsController 和 UISearchController?的主要内容,如果未能解决你的问题,请参考以下文章
NSFetchedResultsController 仅按第一个排序描述符排序
NSFetchedResultsController 性能问题
NSFetchedResultsController - TableView 中的 UI 更新不完整
关系的 NSFetchedResultsController 委托回调