2014-10-07 41 views
0

我有這個簡單的異步代碼。重用dispatch_get_main_queue()/ dispatch_get_global_queue()的結果是否安全?

class MyClass { 
    func myFunc() { 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
      // some background work 
      dispatch_async(dispatch_get_main_queue()) { 
       // foreground work 
      } 
     } 
    } 
} 

我想知道,我們可以重寫這個嗎?

let background_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
let main_queue = dispatch_get_main_queue() 

class MyClass { 
    func myFunc() { 
     dispatch_async(background_queue) { 
      // some background work 
      dispatch_async(main_queue) { 
       // foreground work 
      } 
     } 
    } 
} 

聲明(懶惰)全局變量緩存dispatch_get_global_queue()dispatch_get_main_queue()結果和重用他們。

顯然它按預期工作,但因爲我見過的所有代碼都使用了dispatch_async(dispatch_get_???_queue(成語,所以我認爲它可能是不安全的?

我想知道的是:這是保證安全嗎?

+0

XCode爲dispatch_async提供了一個方便的代碼片段,用於預先填充它。我認爲它通常是保持原樣的,因爲爲什麼要改變它呢? – 2014-10-07 18:40:03

回答

1

是的。給定優先級的dispatch_get_main_queue()dispatch_get_global_queue()將始終返回相同的隊列。爲了您的方便,您可以自由保存這些值。在使用時調用dispatch_get_???_queue是很常見的,但並不是真正的成語。通常沒有理由創建額外的變量。

從文檔的dispatch_get_main_queue()

返回與應用程序的主線程相關聯的串行調度隊列。

確切的是其中之一。

從文檔的dispatch_get_global_queue()

返回一個系統定義的全局併發隊列服務類的特定品質。

這在技術上並不保證每個級別都有一個隊列(雖然有),但全局隊列並不重要(因爲你不能修改它們)。這些隊列確實存在於整個程序的運行中。