![](/img/trans.png)
[英]What is the purpose of nesting dispatch_async(dispatch_get_main_queue()^{}) ?
[英]Purpose of running dispatch_async(dispatch_get_main_queue() on UI Thread
在實際情況下,通常會在UI Thread上實現dispatch_async(dispatch_get_main_queue()。
我的想法是,由於UI線程上只有一個線程,所以dispatch_async的目的是什么?
舉一個我幾天前在這里遇到的真實例子:
在UI線程上運行“ NSTimer ScheduledTimerWithTimeInterval”以更新“ _scrollView contentOffset”
1沒有調度:setContentOffset直到下一個NSTimer調度生效
2與dispatch:setContentOffset立即生效
dispatch_async(dispatch_get_main_queue(), ... )
強制代碼塊在主線程(UI線程)的下一個運行循環上異步運行。 必須在UI線程上運行一些代碼,例如從UI添加/刪除窗口小部件或更新UI。
dispatch_async( .. )
用於不阻塞當前線程。
dispatch_async(dispatch_get_main_queue(),
^{
// perform something on UI
});
dispatch_async是低級別的GCD API(大中央調度API)。 如我們所知,Applications主線程用於在UI上執行任何活動,例如執行動畫/與其他UI相關的東西,因此在與UI進行一些工作的上下文中,至關重要的是它應該有權訪問主線程以及GCD之上的內容API確實為UI提供了對主線程的相同保證訪問,以執行任何相關操作。
GCD到主隊列通常是從后台隊列完成的,以表示某些后台處理已完成。 例如
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0),^{
// Here you are doing a very expensive operation which will take let say 5 secs. And after 5 sec you will got your result. Let say
int output = //calculated result.
dispatch_async(dispatch_get_main_queue(), ^{
[[self myLable] setText:[NSString stringWithFormat:@"%d", output]];
});
});
在這種情況下,我們將在后台隊列上進行冗長的計算,以不阻塞主線程。 得到結果之后,我們需要更新UI。 不應從任何其他線程訪問UIKit
,而應從main thread
訪問UIKit
以避免競爭情況並防止在訪問UIKit
崩潰。 所以在這里我們使用dispatch_async
通過dispatch_get_main_queue()
給主線程一個工作的機會。
我個人在另一個dispatch_async
(后台,非UI線程)內部使用它時-當我執行諸如計算之類的事情或可以在后台線程上運行的任何事情, 然后我想“回來”並相應地更新UI時, dispatch_async(dispatch_get_main_queue()...)
使我返回UI線程,因此可以更新UI。 否則,如果我留在第一個dispatch_async
的后台線程上,則不會在UI上進行任何更改。
也許代碼“ dispatch_async”不在主線程上,dispatch_get_main_queue保證塊中的代碼在主線程上運行。
它喜歡執行selectononmainthread,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.