2

在我的應用程序中,我使用performSelectorInBackground:從磁盤加載圖像。在使用dispatch_async進行一些單元測試後,我決定用dispatch_async調用替換我的performSelectorInBackground。dispatch_async slow then performSelectorInBackground:?

dispatch_queue_t currentBackgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 
dispatch_async(currentBackgroundQueue, ^{ 
    [self getImageFromDisk:sPath delegate:(id)delegate]; 
}); 

該代碼似乎工作,但現在我的圖像加載速度較慢,然後之前。當用戶滾動圖像時,這會導致黑色圖像。

我的應用程序包含一些類型的photoscroller。我無法使用蘋果的平鋪示例代碼,因爲它將應用程序大小增加了很多。我使用this片段從磁盤加載圖像。

回答

5

我以前在其他類似的問題上說過,在全局隊列中使用調度異步會導致類似的行爲,特別是對於最終更新UI的代碼。 YMMV,但是當我嘗試它時,其結果幾乎與同步調用相同。使用NSOperations創建和使用自己的隊列,或者(創建並使用自己的隊列)。

我相信原因是任何發佈到全局隊列的事件都會消耗隊列處理時間,即使代碼是在技術上 asynch。不要將全局隊列用於背景操作。

使用自定義隊列並抽取自己的runloop。

+0

太好了,謝謝。我創建了一個自定義隊列,它工作正常! – Tieme

+0

真棒很高興它的工作 –