ios - 为什么搜索 FetchedResultsController 设置为 nil?

标签 ios uitableview core-data uisearchdisplaycontroller

以下代码来自 this post 已接受的答案,关于使用 Core Data 在表格 View 中实现搜索栏。它使用两个获取结果 Controller (FRC)。一种用于“普通” TableView ,一种用于搜索结果 TableView 。它使用辅助方法来决定 TableView 数据源方法、FRC 委托(delegate)方法等使用哪个 FRC。

除了以下部分之外,我理解大部分代码。我应该输入什么代码来替换注释“更新过滤器...”?为什么我应该将 self.searchFetchedResultsController 及其委托(delegate)设置为 nil?

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSInteger)scope
{
    // update the filter, in this case just blow away the FRC and let lazy evaluation create another with the relevant search info
    self.searchFetchedResultsController.delegate = nil;
    self.searchFetchedResultsController = nil;
    ...
}

最佳答案

以下是将 fetchedResultsController 设置为 nil 时发生的情况。下次 TableView (或搜索结果 TableView )需要数据时,它将查询其数据源,而数据源又引用(不存在的)FRC。如果您查看 fetchedResultsController 方法,您会发现 FRC 是延迟创建的 - 仅当它为 nil 时。在初始化例程中,执行获取请求并向数据源提供新的结果。

虽然这工作得相当可靠,但对于不完全破坏 FRC 仍存在争议。它是多余的并且需要更多的时间、CPU 和电池电量。只需调用即可达到完全相同的效果

[fetchedResultsController performFetch:nil]; 

现在数据源也将具有最新的可用数据。

编辑

正如评论中所述,您应该真正修改 fetchedResultsController 方法以延迟创建。查看 Apple 模板以获取指导。

if (_fetchedResultsController != nil) {
   return _fetchedResultsController;
}
// continue creating a new one

关于ios - 为什么搜索 FetchedResultsController 设置为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12551543/

相关文章:

objective-c - iOS:如何让一个小 View 在多个 View 中可见,而不在每个 View 中初始化它?

ios - 在 Retina 显示屏上的 CGContextRef 上绘画

ios - 如何在不使用 Storyboard的情况下在 UITableView 中使用静态单元格?

iPhone 应用程序因 coreData 错误而崩溃

arrays - swift 中的核心数据数组

ios - GetStream iOS native - 如何在首次初始化后更新客户端 token

iphone - 有很多 "initWith"参数通常是不好的做法吗?

ipad - 弹出窗口中的导航 Controller

ios - 表格 View 在滚动时崩溃

ios - 如何使用 Swift 从 Core Data 中获取组