2012-09-23 69 views
3

基礎很簡單:只需在您的表視圖控制器中實現<UISearchBarDelegate,UISearchDisplayDelegate>。這裏是an adequate tutorial如何在表格視圖中實現搜索(使用FRC)

訣竅是認識到有兩個控制器:一個表視圖控制器和一個搜索顯示控制器。每個控制器都有自己的表格視圖。因此,兩個表格視圖正在播放:普通表格視圖和搜索顯示錶格視圖。當委託方法具有UITableView參數時,差異傳入哪個表視圖,並相應地做不同的事情。

除了以上基本知識之外,數據結構成爲我面臨的主要挑戰。更具體地說,如何篩選和存儲搜索結果?我們有三個選擇:

A.

  • 一個FRC的普通表視圖

  • 存儲結果

  • 使用filteredArrayWithPredicate篩選獲取的對象創建一個數組屬性(陣列)

  • 雅緩存FRC來獲取對象存儲在內存中enahnce性能

B.

  • 一個FRC的普通表視圖

  • 修改FRC的謂詞做過濾器。蘋果DOC指示3個步驟做:

    1. 刪除FRC緩存(最好不要使用一個擺在首位)
    2. 更改謂語
    3. 調用performFetch

Ç

兩個FRC,每個表視圖一個。詳細的實施是在this popular post


接受的答案提供了我認爲是正確的道路要走。我的理由包括:

A做得很好。它只需要對具有FRC屬性的表格視圖控制器進行無意義的更改。更具體地說,只是在每個委託方法的兩個表視圖之間進行區分,並添加一個NSArray屬性來存儲提取結果。當然,添加過濾代碼。

B有一個潛在的缺點:FRC委託方法會對使用哪個提取請求感到困惑?是搜索之前,搜索期間還是搜索之後?儘管可能有解決方案,但如果解決方案A正在運行,我認爲這不值得。

第二個缺點是,如果我們希望搜索結果即時更改。搜索欄中的每個單字母用戶都將導致FRC執行提取操作,這相當昂貴。 C通過使用兩個FRC避免B的第一個缺點,但由於完全相同的原因而遭受第二個缺點。

其他的事情要考慮:

  • 做過濾在後臺隊列。因此,當用戶在搜索欄中輸入時,無論您的過濾費用多高,屏幕都不會被阻止。

  • 創建一個輔助方法來區分兩個表視圖。在相關的委託方法中調用helper方法,這會使代碼更清晰。

以上是我對錶格視圖中執行搜索的理解。如果有任何錯誤,請幫忙指出。非常感謝。

回答

0

我認爲有一些有關UITableViews和FRC的概念錯誤。 FRC只是一個從Core Data獲取數據的類,與MOC一起確保其保持數據完整性,即使您有幾個同時訪問同一數據庫的選項卡,每個選項卡都會執行自己的更新。在幕後,有一些進程正在確保一個選項卡中的更新反映在所有其他選項卡中。我實際上說的是,如果你繞過推薦的方法,會有後果。

如果出於某種原因需要執行[tableview reloadData],performFetch輸出可以存儲在緩存中並跳過抓取;您當然可以編程來讓tableview從多個來源獲取其數據,但我沒有看到這樣做的任何理由。如果多個來源的唯一原因是在搜索之前跟蹤結果,應該有一種方法來重置謂詞,以便FRC獲取所有(當前)記錄。在我的應用程序中,將全部或全部記錄放入搜索欄中,結果爲謂詞1 = 1,它獲取所有記錄。同樣,這可能與單個視圖應用程序無關,但帶有大量併發更新的選項卡式應用程序需要這樣才能確保數據全部都是最新的。

相關問題