如何從後臺線程上的資源加載圖片?從UI線程加載圖片?
我目前這樣做的,它減緩我的UI相當多的事情:
image = [NSData dataWithContentsOfFile:imageName];
我寧願它加載它在後臺線程。
如何從後臺線程上的資源加載圖片?從UI線程加載圖片?
我目前這樣做的,它減緩我的UI相當多的事情:
image = [NSData dataWithContentsOfFile:imageName];
我寧願它加載它在後臺線程。
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
});
});
我這樣做,但我連續調用5 dataWithContentsOfFile從磁盤5個5MB JPG,它仍然阻止用戶界面。我也嘗試過把5個隊列分解爲你的解決方案,並且用NSOperationQueue來創建相同的邏輯,但是兩者仍然阻塞了用戶界面。有很多線程,但我找不到一個好的解決方案。你知道任何文件/參考異步加載本地資產/文件? – Mat
可以使用CGDataProvider
打開CGImage
。
例如,您可以使用CGImageCreateWithPNGDataProvider
,數據提供者將引用CFURL
。您可以對CFData
表示使用類似的方法。
然後您可以使用CGImage
或跳回到主線程並創建一個UIImage
表示。
最後,您可以從輔助線程加載CFData
或NSData
,然後跳回到主線程以對其執行某些操作。
也可能值得注意的是UIImage
是不可變的類型,並且在某些情況下使用緩存。如果您多次加載相同的表示,請確保您沒有禁用該優化。
你不能只使用GCD並在那裏包裝那些行嗎? –
我對iOS並不是很熟悉,只是在學習。你能舉個例子嗎? –
以及我的意思是什麼jano說,或者你可以使用performSelectorInBackground(NSObject方法) –