2013-07-17 61 views
1

我在我的應用程序中使用核心數據來存儲可能具有多達50k個對象或更多對象的實體。我有一個NSFetchedResultsController在表視圖中配對。表格視圖工作正常,由於細胞重用,但我最大的問題是排隊實際的數據庫來獲取數據集。如何有效處理核心數據中的大數據集?

當我第一次加載表視圖我需要從數據庫的所有結果。我使用默認的獲取請求與一個排序描述符,我已經將batchSize設置爲1,000。在iPad 2上,此查詢最多需要15秒才能完成!我也必須在搜索被取消之後運行這個查詢,所以總體上它使應用程序不可用。我的假設是,CD仍然必須解決所有這些結果或設置節或什麼,我真的不知道,但只使用batchSize不會幫助?內容也是非常動態的,因爲新行總是被添加,排序順序改變等等。所以緩存具有有限的益處。

我現在在想,最好的選擇是在fetchRequest中使用fetchLimit,然後實現一些基本的分頁。當表格視圖滾動到結尾時,獲取結果的下一個「頁面」?這種方法唯一的問題是我失去了sectionIndex,我不能想出任何方法。

任何人有任何想法或已經處理此問題?

+0

爲什麼你需要整個數據集? – Wain

回答

2

當您爲FRC設置提取請求時,批量大小應該比任何時候在屏幕上可以看到的項目數量大一倍,可能是其大小的兩倍。 FRC已經爲您做了分頁,您只需要更好地設置頁面大小。

+0

thx我明白批量大小如何工作,但我的問題是實際的SQL查詢需要永遠。 –

+0

但爲什麼你需要提出這麼大的要求? – Wain

+0

好問題。不幸的是,這是產品設計的方式。我猜它與其他任何具有大量行的應用程序沒有什麼不同,但通過每頁僅顯示x個結果來解決此問題。模擬這一點的唯一方法是使用fetchLimit來阻止核心數據獲取更多數據,然後才需要。數據也不適用於我可以用來縮小結果集的一致分組。 –

0

s.newave,

您的行的高度是否可變?如果是這樣,那麼表視圖會要求您計算每個高度,並導致每行都被提取。 15秒是不合理的時間來獲取50K項目。

更大的問題是您不想更改設計的陳述。坦率地說,一個50K項目的tableview是沒用的。你應該改變你的設計 - 不是因爲CD很慢,它不是 - 但是因爲你的設計不實用。

Andrew

P.S.獲取的結果控制器是爲主流應用程序設計的。 50K桌面視圖不是主流應用程序。如果你堅持使用50K的桌子視圖設計,你將不得不自己製造控制器。