2013-12-17 61 views
1

我在集合視圖中顯示一些圖像,並使用SDWebImage預取所有這些圖像的縮略圖。核心數據 - 嘗試預取所有行的屬性很慢

我在NSFetchRequest中使用20的批處理大小,但是當遍歷每個對象以獲取我需要的圖像的url時,批處理大小性能增益會被浪費。重新加載數據需要0.3s而不是0.000295s,這會導致用戶界面明顯延遲。

我試過設置[request setPropertiesToFetch:@[@"propertyName"]],但它似乎沒有區別。我想這不是我要找的方法。

有什麼建議嗎?

編輯:

我使用由NSFetchedResultsController(和代表)的備份數據UICollectionView源使用。我製作批量爲20的NSFetchRequest,並通過NS-FRC取回。我還需要從所有獲取對象獲得的URL列表,即:

for(NSManagedObjectSubclass *object in frc.fetchedObjects) 
// this is causing the slow-down, because it's faulting all the objects 
// not what you'd want if you have many objects! 
{ 
    [urlList addObject:(object.url)] 
} 

[SDWebImagePrefetcher prefetchUrls:urlList]; 
// this runs in the background and downloads/gets from cache a list of images 
+0

在您的問題中添加一些代碼,但這不夠詳細。 –

+0

你真的在下載圖片嗎?還是將它們存儲在覈心數據中? –

+0

不可以。圖像不以任何方式存儲在覈心數據中。所有的圖像資料都由'SDWebImage'處理,這是一個用於異步下載/緩存/從緩存中加載圖像的庫。我會嘗試在問題中添加一些細節。 –

回答

2

我們看看NSFetchRequest類引用,-setPropertiesToFetch:。 「只有當resultType設置爲NSDictionaryResultType時才使用此值。」

對於遍歷所有提取的對象而言,您是正確的,這會損害小批量的優勢。不過,我很好奇,爲什麼你需要一次預取所有的圖像URL。如果您這樣做是爲了觸發下載,請在-awakeFromFetch中查看:將object.url關閉到您的SDWebImagePrefetcher,這會將請求排入隊列並開始或繼續處理。您必須繼承NSManagedObject才能完成此操作。

+0

謝謝,我錯過了那個resultType屬性。 一旦集合視圖單元格可見,我正在下載每個圖像,但我也想要預取圖像,以便在用戶滾動時它們已被加載。 問題是,一旦你將一個新數組傳遞給SDWebImagePrefetcher,它就會取消其他操作,所以這就是爲什麼我一次需要所有的URL。 –

+1

如何在'SDWebImagePrefetcher'上編寫自己的控制器類?該類將接受單個圖像請求,構建自己的隊列,然後使用'-prefetchURLs:completed:'中的回調塊啓動另一批處理。 –