2015-07-03 55 views
-1

我正在構建一個應用程序,它實現了一個文本輸入發生變化時查詢數據庫的活動文本搜索。 它可以工作,但當NSFetchedResultsController的fetchRequest返回超過一定數量的項目(>〜20)時,鍵盤輸入會很遲鈍。NSFetchedResultsController performFetch很慢返回很多項

func textViewDidChange(textView: UITextView) { 
    let predicate = NSPredicate("itemID" > 0) //<- returns all items 
    self.frc.fetchRequest.predicate = predicate 
    self.frc.executeFetchRequest(nil) 
} 

請注意,沒有實際的UI更新正在進行,所以laggy鍵盤輸入必須由fetchRequest引起。

有沒有一種方法來實現大量項目的實時搜索沒有這種滯後?

+0

它接縫你的謂詞不會改變。每次按鍵上的所有項目都有什麼用處? – Mundi

+0

示例代碼是將問題縮小到僅提取項目的結果。在實際項目中謂詞發生變化,UI更新顯示新數據 – matteok

+0

一種解決方案是隻有在至少有2個字符後纔開始讀取。 – Mundi

回答

0

問題是,您正在主線程上執行提取操作,並在請求中加載所有對象。你真的需要加載所有的項目嗎?作爲第一步,設置一個fetchBatchSize只有幾個項目實際加載到內存中,當您在視圖中滾動時,有些項目會自動加載,其他項目會出現故障。如果這還不夠,請考慮設計更改,您應將實際提取移至後臺隊列,並在結果進入時更新您的用戶界面。這是一項重大改變,因爲如果用戶必須取消先前的正在進行的請求使搜索上下文無效(即他鍵入一個新字符)。

+0

您能否提供一個關於如何在後臺線程上執行提取以及如何取消正在進行的請求的快速示例? – matteok

+0

這不是一個簡單的任務,並且需要對功能進行重大更改。將其解釋爲答案的一部分將需要很長時間。這就是爲什麼我建議從'fetchBatchSize'開始。 70個對象聽起來像一個小尺寸,如果管理得當,實際上會停止主線程。如果您仍然需要努力,我建議您閱讀使用父子上下文和「NSOperationQueue」和操作的Core Data多線程。 –

+1

設置fetchBatchSize並不會提高性能,即使設置fetchLimit也會導致我期望設置fetchBatchSize會產生非常類似的效果。 – matteok