2012-09-23 105 views
0

下面的代碼來自this post的接受答案,關於在具有核心數據的表視圖中的實施搜索欄。它使用兩個提取結果控制器(FRC)。一個用於「普通」表格視圖,一個用於搜索結果表格視圖。它使用輔助方法來決定哪些FRC用於表格視圖數據源方法,FRC委託方法等。爲什麼searchFetchedResultsController設置爲零?

我瞭解大部分代碼,除了以下部分。我應該放什麼代碼來取代"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; 
    ... 
} 

回答

1

下面是當您將fetchedResultsController到零會發生什麼。下一次表格視圖(或搜索結果表格視圖)需要數據時,它將查詢它的datasource,然後引用(不存在的)FRC。如果您查看fetchedResultsController方法,您將看到FRC是懶惰創建的 - 只有在它是 nil 。在初始化例程中,執行提取請求並將新的結果提供給數據源。

儘管這種方法非常可靠,但還是有一個理由是不能完全破壞FRC。這是多餘的,需要更多時間,CPU和電池電量。只需撥打電話

[fetchedResultsController performFetch:nil]; 

現在數據源也會有最新的可用數據。

編輯

正如評論指出你應該修改fetchedResultsController方法來創建懶洋洋地。看看蘋果模板的指導。

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

「如果你看着fetchedResultsController方法」..你能更準確地確切地說明哪種方法嗎?那是' - (NSFetchedResultsController *)newFetchedResultsControllerWithSearch:(NSString *)searchString '? – Philip007

+0

我仍然無法理解「FRC是懶惰創建的代碼 - 只有它是零」的代碼部分。你可以在這裏複製粘貼該部分?您發佈的鏈接中的「FRC創建代碼」爲 – Philip007

+0

。如果沒有FRC'self.fetchedResultsController'要創建一個新的FRC。您將在該方法中找到獲取權限。看起來實際上比我想象的還要糟糕!這種方法每次都會重新創建FRC **。這是一個非常不理想的模式。 – Mundi

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]; 
     }); 
    }); 
} 
+0

感謝您的過濾方法的實施。在後臺隊列中過濾可能會增強用戶體驗。但是,您使用NSArray來存儲搜索結果(並可能爲所有提取的對象提供另一個數組)。這不是我在帖子中需要的數據結構。 – Philip007

相關問題