2011-12-09 36 views
3

我正在查看Apple的TableSearch示例代碼。看起來他們對於所有內容都有一個NSArray,對於過濾的內容有一個NSMutableArray。然後如果過濾器打開,那麼它們將顯示NSMutableArray。如果它關閉,他們會顯示包含所有數據的NSArray。爲UITableView篩選內容

1)我想知道這是否是過濾器的常見實現,因爲我之前沒有做過多的過濾。

2)若要添加到該問題,如果我有一個四個不同類別的過濾器,我仍然會使用一個NSMutableArray顯示過濾器打開時的過濾內容?或者,我爲每種不同類型的過濾器創建四個不同的NSMutableArrays,然後根據所使用的過濾器顯示該列表。

假設通用實現是爲列表提供一個NSArray,如果我要做四個不同的NSMutableArrays,或者根據點擊從用戶選擇什麼過濾器選項,我應該在飛行中創建NSMutableArray,然後重新加載[tableView reloadData];

謝謝。

回答

2

我沒有在我面前的示例應用程序,但您通常會使用謂詞進行過濾,因此您可以查看docs on NSPredicate將對您有所幫助。

所以,當你想改變過濾器,你通過改變謂詞來做到這一點。您不必創建所有過濾的結果。您只能在任何特定時刻創建您需要的那個。

使用數組,您可以使用類似shown in this example的代碼進行過濾。重點行是

NSPredicate *predicate; 
predicate = [NSPredicate predicateWithFormat:@"length == 9"]; 
NSArray *myArray2 = [myArray filteredArrayUsingPredicate:predicate]; 

過濾並不總是與數組完成。如果使用核心數據,則可以使用NSFetchedResultsControllers完成。在那裏也使用謂詞,非常相似。謂詞還可以用於其他事物,包括正則表達式過濾。如果你不熟悉它,值得一看。

1

這真的取決於。如果您的基礎數據在覈心數據中,請使用NSFetchedResultsController並給它NSPredicate s。如果您有一組數據,則可能最容易遍歷它並創建另一組數據。

通常,過濾器本身不可能像整個繪圖過程(其中包括實例化或回收表格單元格)那樣昂貴。您可以使用樂器輕鬆完成簡介。

保持四個不同的數組在內存方面通常不是一個好主意,這是一種稀缺資源。

無論如何,reloadData都會涉及。 (根據操作系統版本,也許 - 請參閱NSFetchedResultsController文檔。)