为什么搜索FetchedResultsController设置为nil?

时间:2012-09-23 10:27:08

标签: ios uitableview core-data uisearchdisplaycontroller

以下代码来自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;
    ...
}

2 个答案:

答案 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];
        });
    });
}