2011-10-29 55 views
0

如何從後臺線程上的資源加載圖片?從UI線程加載圖片?

我目前這樣做的,它減緩我的UI相當多的事情:

image = [NSData dataWithContentsOfFile:imageName]; 

我寧願它加載它在後臺線程。

+2

你不能只使用GCD並在那裏包裝那些行嗎? –

+0

我對iOS並不是很熟悉,只是在學習。你能舉個例子嗎? –

+1

以及我的意思是什麼jano說,或者你可以使用performSelectorInBackground(NSObject方法) –

回答

5
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_queue_t mainQueue = dispatch_get_main_queue(); 
dispatch_async(backgroundQueue,^{ 
    // background process 
    image = [NSData dataWithContentsOfFile:imageName]; 
    dispatch_async(mainQueue,^{ 
    // always update GUI from the main thread 
    // uiimageview.image = image.... etc 
}); 
}); 
+0

我這樣做,但我連續調用5 dataWithContentsOfFile從磁盤5個5MB JPG,它仍然阻止用戶界面。我也嘗試過把5個隊列分解爲你的解決方案,並且用NSOperationQueue來創建相同的邏輯,但是兩者仍然阻塞了用戶界面。有很多線程,但我找不到一個好的解決方案。你知道任何文件/參考異步加載本地資產/文件? – Mat

3

可以使用CGDataProvider打開CGImage

例如,您可以使用CGImageCreateWithPNGDataProvider,數據提供者將引用CFURL。您可以對CFData表示使用類似的方法。

然後您可以使用CGImage或跳回到主線程並創建一個UIImage表示。

最後,您可以從輔助線程加載CFDataNSData,然後跳回到主線程以對其執行某些操作。

也可能值得注意的是UIImage是不可變的類型,並且在某些情況下使用緩存。如果您多次加載相同的表示,請確保您沒有禁用該優化。