2010-11-15 103 views
1

我正在使用核心數據和NSFetchedResultsController的應用程序。該應用程序的一個主要組件是基於一組15個左右的預定義開關來過濾索引表視圖中的項目,這些開關對應於我的管理對象的屬性或關係。在我的大多數情況下,我正在搜索大約300-400個對象,因此緩存/性能不是問題。一切都非常活潑,無需緩存。iPhone奇怪的核心數據緩存性能問題

但是,我的應用程序的一部分基本上搜索了我的CD數據庫中的所有對象(約15,000項)。在這裏,我試圖在NSFetchedResultsController上實現緩存來提高性能。 NSFetchedResultsController的'cacheString'屬性就是謂詞的字符串值。每當用戶切換過濾器開關,我創建一個新的謂詞,創建一個新的NSFetchedResultsController,並將緩存設置爲新的謂詞的字符串值。獲得所有物品的第一個命中(未過濾)需要大約7秒鐘,隨後的命中次數不到一次。但是,這裏是我的問題 - 一旦我繼續進行表視圖的「下一步」(我將新視圖控制器推送到導航控制器,並將它傳遞給NSFetchedResultsController的fetchedObjects的引用) ,性能大幅下降。該下一個視圖本質上是一個視圖的表格列表的不同表示(水平分頁滾動視圖),其中一個項目一次顯示在屏幕上。當我從一個項目轉到下一個項目時,訪問fetchedObjects陣列中的前一個或下一個對象會將手機鎖定約5秒鐘。 「鎖定」持續時間會延長您進入fetchedObjects數組的時間。如果'我== 0',沒有可感知的滯後。如果'i == 10,000',則需要大約15秒才能訪問下一個對象。趕快行動吧!如果我禁用了緩存(或者它是一個沒有被緩存的查詢,所以它需要提取新的結果),除了初始的過濾器查詢以外,其他所有內容都是快速且快速的,沒有滯後。

啓用緩存是否僅爲表視圖緩存索引信息,而不是緩存對象本身的索引信息?

我不確定這裏的交易是什麼。我希望我解釋得很好 - 讓我知道如果你想看到一些代碼或需要額外的信息。

謝謝! 比利

回答

4

好吧,我已經找到了我的問題是什麼?

基本上,問我的NSFetchedResultsController經由objectAtIndexPath一個managedObject:具有極大的不是直接去到fetchedObjects陣列並要求objectAtIndex更快: (當然,這正是我所做的),特別是當你的指數進入數千人時。雖然我不確定100%爲什麼。我猜NSFetchedResultsController做一些花哨的東西,以有效地拉出單個對象,而不是直接到原始數據。所以,我認爲緩存與我的性能問題沒有任何關係。

感謝那些檢查了我的問題。我希望這可以幫助任何有類似問題的人。