2012-06-22 50 views
7

我正在執行一個返回約2000個實體的讀取請求。目前,我的設備需要大約20秒。所以我想我可能會設置一個100的提取限制,然後當用戶滾動到表視圖的末尾時,獲取接下來的100個實體。這可以使用NSFetchRequest'ssetFetchLimitsetFetchOffset來完成。批處理核心數據讀取結果

但是,我無法弄清楚的是,如果在我第二次抓取對象101-200時,對象1-100會發生什麼?我是否必須爲每100個項目分別使用NSFetchedResultsController,然後將我的表視圖數據源方法配置爲基於多個提取結果控制器進行查詢?或者我可以以某種方式使用相同的NSFetchedResultsController以某種方式一次獲取100個實體,但是在每次後續提取時,只需將接下來的100個項目添加到原始的100個項目中?

編輯:這是我的代碼:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"MessageObject" inManagedObjectContext:appDelegate.managedObjectContext]; 

    [fetchRequest setEntity:entity]; 
    NSPredicate *predicate= [NSPredicate predicateWithFormat:@"ANY tags.tagName==%@", currentTagObject.tagName]; 
    [fetchRequest setPredicate:predicate]; 
    NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 
    [fetchRequest setFetchBatchSize:5]; 
+0

你可以顯示你的構建的獲取請求?據我所知,獲取結果控制器(我認爲簡單的獲取請求也是)使用錯誤來爲你做這件事。有可能您的「查詢」可以被優化。 –

+0

我已經發布了一些我的代碼。我不明白 - 爲什麼需要20秒才能獲取實體呢?當我設置100的限制時,它在1秒內獲取,但沒有限制,獲取2000個實體,需要20秒。 – Snowman

回答

2

你實際上並不需要做任何事情來達到您所指定的大小批量抓取。您將得到您所描述的行爲,只需在單個控制器上執行單個獲取請求即可 - 通過設置批處理大小屬性,您只需向CoreData暗示您認爲自己考慮的最佳批處理大小。 CoreData將按照您需要的順序處理指定大小的連續批處理對象 - 並且在需要內存消耗時它將錯誤管理對象。

+0

爲什麼需要20秒才能獲取實體呢?當我設置100的限制時,它在1秒內獲取,但沒有限制,獲取2000個實體,需要20秒。 – Snowman

+0

那麼,它仍然會根據您指定的大小執行提取。抓取100比抓取2000快。在您的fetchRequest上,將批量大小設置爲50或100.就是這樣。沒有別的了。您的所有記錄將根據需要繼續加載,因爲CoreData處理後續必要的讀取和故障。 – isaac

+0

但是,這不是解決方案 - 我需要消除20秒的等待,並且設置批量大小似乎沒有什麼區別。另外,奇怪的是,我只是將batchSize設置爲2000,並且在9秒內獲取,相比之下,需要20秒的batchSize爲5。那是怎麼回事? – Snowman

3

使用ANY是一個非常昂貴的操作。我不確定關係,但您可以嘗試爲特定標記名稱而不是您的消息對象實體獲取標記實體。然後使用反比關係來獲得消息對象實體

此外,您的排序正在使用一個比較器,我敢肯定,這並不是有幫助的事情。日期應該以核心數據存儲爲一個整數,這樣你就可以直接進行排序而不需要使用選擇器。

核心數據非常快,我已經通過65,000條記錄進行了關鍵字搜索,並且返回了以毫秒爲單位的結果。

好luc

+0

儘管這都是事實,但它並沒有真正回答這個問題。...... – lnafziger

+3

這絕不是關於答案,而是引導人們走向正確的方向。 – Snowman

+0

@tim這實際上是一個好主意,關於檢索單個標籤對象並獲取消息集。會快得多。但是,我怎樣才能將它綁定到NSFetchedResultsController?如果一個標籤有2000個對象,我不想將它們全部加載到內存中。使用提取結果控制器,在任何給定時間,只有少數幾個將被加載到內存中。 – Snowman