以下代码来自this post的已接受答案,关于使用核心数据的表格视图中的工具搜索栏。它使用两个提取结果控制器(FRC)。一个用于“普通”表视图,一个用于搜索结果表视图。它使用辅助方法来决定用于表视图数据源方法,FRC委托方法等的FRC。
我理解除以下部分之外的大部分代码。我应该用什么代码替换评论"update the filter..."
?为什么我应该将self.searchFetchedResultsController及其委托设置为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;
...
}
答案 0 :(得分:1)
以下是将fetchedResultsController
设置为nil时发生的情况。下次表视图(或搜索结果表视图)需要数据时,它将查询其datasource
,后者又引用(不存在的)FRC。如果你查看fetchedResultsController
方法,你会看到FRC是懒惰创建的 - 只有。在初始化例程中,执行获取请求并使新的结果可用于数据源。 nil
虽然这种方法非常可靠,但有一个论点是不能彻底摧毁FRC。它是冗余的,需要更多时间,CPU和电池电量。只需调用
即可实现完全相同的效果[fetchedResultsController performFetch:nil];
现在数据源也将提供最新数据。
修改强>
如评论中所述,您应该真正修改fetchedResultsController
方法以便懒惰地创建。查看Apple模板以获得指导。
if (_fetchedResultsController != nil) {
return _fetchedResultsController;
}
// continue creating a new one
答案 1 :(得分:0)
我简要阅读了接受答案的代码。很多只是骨架,显示了实施的方法。也就是说,我从未在filterContentForSearchText:scope:
方法中实施“吹走FRC”的方法;但我确实有生产代码中带有搜索栏功能的NSFetchedResultsController支持的表视图。
以下是其中一个filterContentForSearchText:scope
的示例:
- (void)filterContentForSearchText:(NSString *)searchText scope:(NSString *)scope;
{
/* clear the filtered list */
[_mutableFilteredLadders removeAllObjects];
/* in background queue filter our list */
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSPredicate *ladderTitlePredicate = [NSPredicate predicateWithFormat:@"title CONTAINS[cd] %@",searchText];
NSPredicate *ladderTextPredicate = [NSPredicate predicateWithFormat:@"ANY ladderItems.text CONTAINS[cd] %@",searchText];
NSPredicate *searchPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:ARRAY(ladderTextPredicate,ladderTitlePredicate)];
[_mutableFilteredLadders addObjectsFromArray:[[self allLadders] filteredArrayUsingPredicate:searchPredicate]];
/* reload table on the main queue */
dispatch_async(dispatch_get_main_queue(), ^{
[[[self searchDisplayController] searchResultsTableView] reloadData];
});
});
}