2015-04-17 35 views
1

這是相當常見的真實案例,dispatch_async(dispatch_get_main_queue()是在UI線程執行看到的。我無法弄清楚它的目的。目的上運行UI線程dispatch_async(dispatch_get_main_queue()的

我的想法是因爲這裏只有一個UI線程上線,什麼是dispatch_async的目的

拿我天前在這裏會見了一個真實的例子:在UI線程

運行一個「的NSTimer scheduledTimerWithTimeInterval」更新「_scrollView contentOffset」

1沒有調度: setContentOffset得到有效,直到明年的NSTimer時間表

2調度: setContentOffset得到有效的立即

+0

你可以給一些上下文嗎?也許代碼*可以從後臺線程運行,所以它只是爲了安全起見。否則,它可能只是延遲代碼,直到佈局引擎有時間運行。 –

+0

我在上面給出了一個例子 – Jacky

回答

0

dispatch_async(dispatch_get_main_queue(), ...)強制的代碼塊要在主線程的下一個運行循環異步運行(UI線程)。一些代碼必須在UI線程上運行,例如從UI添加/刪除窗口小部件或更新UI。

dispatch_async(..)用於不阻止當前線程。

+0

在實踐和現實中,我發現這種方式可以加快UI線程忙於其他幾項任務時的執行速度,即使它沒有意義。 – Jacky

0
dispatch_async(dispatch_get_main_queue(), 
         ^{ 
          // perform something on UI 
         }); 

dispatch_async是一個低級別的GCD API(Grand Central Dispatch API)。正如我們所知,應用程序主線程用於在UI上執行任何活動,如執行動畫/任何其他UI相關的東西,因此在使用UI進行一些工作的情況下,它應該有權訪問主線程以及GCD之上的內容API提供了與主線程相同的保證訪問權限,以便UI執行任何相關操作。

0

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期間崩潰。所以在這裏我們使用dispatch_async給主線程dispatch_get_main_queue()工作的機會。

0

我個人使用它時,裏面的另一個dispatch_async(背景,非UI線程) - 當我做類似的計算或只是任何可以在後臺線程運行然後我要「回來」和更新UI相應地,dispatch_async(dispatch_get_main_queue()...)將我返回到UI線程,因此我可以更新UI。否則,如果我保留在第一個dispatch_async的後臺線程中,則不會對UI進行任何更改。

0

也許代碼「dispatch_async」不在主線程上,dispatch_get_main_queue保證塊中的代碼在主線程上運行。

它喜歡performselectonmainthread,

相關問題