簡體   English   中英

在UI線程上運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM