2012-03-07 89 views
48

在一些其他的方式,有在GCD是這兩種方式來獲得隊列:GCD中的「全局隊列」和「主隊列」有什麼區別?

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

dispatch_get_main_queue(); 

如果我不是完全錯誤的,「主隊列」的主線程上執行,也是很好的「回調「執行UI工作的塊。

這是否意味着「全球隊列」是一個在後臺線程上運行?

回答

66

主隊列像你說的確實在主線程上運行。

全球隊列是併發的隊列和從dispatch_get_global_queue主頁:

不像 dispatch_queue_create(分配的主隊列或隊列),全球併發隊列 調度塊儘快線程變得可用(「非FIFO」完成順序)。全球併發 隊列代表三個優先樂隊:

 • DISPATCH_QUEUE_PRIORITY_HIGH 
     • DISPATCH_QUEUE_PRIORITY_DEFAULT 
     • DISPATCH_QUEUE_PRIORITY_LOW 

塊提交給高優先級的全局隊列會提交 默認或低優先級隊列全球前那些被調用。提交給低優先級全局隊列的塊只有在默認或高優先級隊列上沒有掛起的塊時纔會調用 。

因此,它們是在後臺線程可用時運行的隊列。他們是「非FIFO」,所以訂購不保證。

+0

說全球隊列是併發隊列,你不能創建自己的併發隊列(使用'dispatch_queue_create'或其他)嗎? – 2016-04-28 04:30:40

7

是。可以在設備上運行這樣的代碼來測試它:

dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      NSLog(@"Block 1a"); 
      NSAssert(![NSThread isMainThread], @"Wrong thread!"); 
      NSLog(@"Block 1b"); 
     }); 
dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      dispatch_async(dispatch_get_main_queue(), ^{ 
        NSLog(@"Block 2a"); 
        NSAssert([NSThread isMainThread], @"Wrong thread!"); 
        NSLog(@"Block 2b"); 
       }); 
     }); 
21

5個隊列(4背景,1主)都具有不同的線程優先級(-[NSThread threadPriority])太:

      -main- : 0.758065 
     DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258 
    DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000 
     DISPATCH_QUEUE_PRIORITY_LOW : 0.467742 
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000 

(測試上一個iPod第四代和在MacBook Pro上的模擬器)

1

全球調度隊列:在併發隊列前

  1. 任務ecutes同時[後臺線程]
  2. 任務依然順序開始,他們添加到隊列

主要調度隊列:

上執行任務
  1. 可用串行隊列中的應用程序的主 線。
  2. 它通常是從背景隊列調用時一些 後臺處理已經完成和用戶接口需要 被更新。