0

以下代码来自这篇文章的公认答案,关于使用 Core Data 在表格视图中实现搜索栏。它使用两个获取结果控制器(FRC)。一种用于“普通”表视图,一种用于搜索结果表视图。它使用辅助方法来决定表视图数据源方法、FRC 委托方法等使用哪个 FRC。  

除了以下部分,我了解大部分代码。我应该输入什么代码来替换评论"update the filter..."?为什么我应该将 self.searchFetchedResultsController 及其委托设置为零?

- (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;
    ...
}
4

2 回答 2

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
于 2012-09-23T14:43:57.500 回答
0

我简要阅读了已接受答案的代码。很多只是骨架,显示了要实现的方法。也就是说,我从来没有在方法中实现过“吹走FRC”的filterContentForSearchText:scope:方法;但我确实有 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];
        });
    });
}
于 2012-09-23T11:33:31.477 回答