2016-08-26 24 views
3

我正在做一個關於大中央調度的教程。從本質上講,教師在閉包裏面有一些長時間運行的任務,所以他把所有東西都放在後臺隊列中(代碼太長,不能編寫,沒有提供源代碼)。總之,他有這個格式大中央調度,QOS用戶交互與獲取主隊列

dispatch_async(QOS_CLASS_BACKGROUND, { 
    //time consuming tasks which should not be on main queue 
}) 

但是封閉在那裏一切都在後臺隊列裏面,有一些代碼更新了用戶界面。我被教導(主要是udacity),所有的UI更新應該在主隊列中。因此

dispatch_async(dispatch_get_main_queue(), ... 

雖然教官,而不是使用

dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), {...} 

我瞭解到,自從QOS_CLASS_USER_INTERACTIVE是爲當前的任務,因爲這是適當的與用戶界面相關。然而使用vs get_main_queue有什麼優勢?

+0

也許[這個問題](http://stackoverflow.com/questions/36735946/global-queue-with-qos-class-user-interactive)和[GDC cheat sheet](https://lionhylra.wordpress .com/2015/09/06/gcd-for-swift-cheatsheet /)可以回答你的問題 – Tj3n

回答

2

dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)返回全球併發 隊列這是適合的任務,需要做的「迅速」,以更新 用戶界面。該隊列上的任務比例如具有更高的優先級。任務隊列中的一個 QOS_CLASS_BACKGROUND隊列。但這是不是的主隊列。

UI更新本身必須在 dispatch_get_main_queue()獲得的主隊列上完成。

+0

文檔說你可以更新UI ---「 - QOS_CLASS_USER_INTERACTIVE:用戶交互式類表示需要立即完成的任務以便提供良好的用戶體驗,將其用於UI更新,事件處理和需要低延遲的小型工作負載。在執行應用程序期間,在此類中完成的工作總量應該很小。 – RyanTCB

+1

@RyanTCB:請參閱https://developer.apple.com/reference/uikit:絕大多數情況下,僅在您的應用程序的主線程中使用UIKit類。對於從UIResponder派生的類或者以任何方式涉及操縱應用程序用戶界面的類尤其如此。 –

+0

文檔也表示使用QOS_CLASS_USER_INTERACTIVE。我爲什麼認爲原始問題是被問到的。因爲它令人困惑https://developer.apple.com/library/content/documentation/Performance/Conceptual/EnergyGuide-iOS/PrioritizeWorkWithQoS.html – RyanTCB