2017-10-13 32 views
3

示例A: - 這會導致應用程序崩潰。main.async vs main.sync()vs global()。Swift3中的異步GCD

DispatchQueue.main.async {   
     let url = URL(string: imageUrl) 
     do { 
      let data = try Data(contentsOf: url!) 
       DispatchQueue.main.sync { 
        self.imageIcon.image = UIImage(data: data) 
       } 
      } 

實例B: - 但這並不

DispatchQueue.global().async { 
     let url = URL(string: imageUrl) 
     do { 
      let data = try Data(contentsOf: url!) 
       DispatchQueue.main.sync { 
        self.imageIcon.image = UIImage(data: data) 
       } 
      } 

按我的知識,

  • x.sync意味着在主線程/ UI線程和x.async做的事意味着 在後臺線程中執行。
  • 全局意味着執行一些併發隊列,即並行 任務。

Quest1: - 那麼爲什麼我的應用程序崩潰時,我在後臺線程執行任務,即main.async和比調用主線程來更新用戶界面。

任務2: - main.async & global()。async是否有區別。

+1

你似乎有你的術語混淆,主=主線程,全局=後臺線程,同步意味着執行串行任務(在該隊列,例如主/全球) ,異步是併發的(再次在單個隊列上的併發任務),我有一個很好的頁面解釋這在stackoverflow文檔,但他們已經關閉它現在下來:( – Fonix

+1

「x.sync意味着做主線程/ UI線程和x.async意味着在後臺線程中做的事情」 - 我不認爲這是真的,你不應該想到隊列爲線程(他們不一樣)。調用'async'意味着它不會阻塞,但是你在'DispatchQueue.main'上調用它,這是一個保證在主線程上運行的隊列。 – Ssswift

+0

我從[鏈接]中瞭解到「x.sync表示在主線程/ UI線程中執行的操作」... https://stackoverflow.com/questions/42772907/what-does-main-sync-in- global-async-mean –

回答

1

在簡單術語我來結論 -

  • 隊列 - 有3種類型,即隊列1主隊列,4全局隊列和自定義隊列的任何編號。
  • 主題 - 一個是主線程和其他後臺線程,系統 提供給我們。

DispatchQueue.main.async

使用後臺線程的(W/O UI的阻擋),而當任務結束它自動執行更新在主隊列任務 - 它手段UI因爲其已經在主隊列中。

DispatchQueue.global()。全球()。同步異步沿

這意味着全局隊列使用後臺線程和任務時後執行任務,比全球()。同步使用將工作從globalQueue帶到更新爲UI的mainQueue

原因我的應用程序崩潰

我試圖用(main.sync)把完成的任務MainQueue,而是因爲我說好的切換隊列它已經在MainQueue,這創建DeadLock(MainQueue等待自己),導致我的應用程序崩潰

4

在第一種情況下,您運行main上的代碼,然後在主線程上使用main.sync。實質上,你試圖告訴main隊列等待自己 - 這顯然是無稽之談,因此它會導致崩潰。

在第二種情況下,運行在後臺線程的代碼,然後你用main.sync等到main線程可以運行在main.sync提供的塊。

一般來說,我會一直使用async而不是sync,除非sync是必要的。

+1

是的,'sync'只是意味着要等到這個塊完成執行,'async'不會等待。在主線程中一定要小心使用'sync',否則會阻塞你的UI更新 – Fonix

+0

我知道global()。async意味着在後臺執行任務,但main.async意味着什麼? –

+0

感謝您的幫助,我發佈了我的最終結論..請好好檢查一下.. –

2

您在混合使用術語sync/async和main/global。

同步 - 同步運行某些任務(即線程可以是主/全球/任何其他線程將等待任務完成)

異步 - 異步運行的一些任務(即線程可以是主。/全球/任何其他線程將推動任務隊列中,並繼續執行你的外塊下一步它不會等待)

現在讓我們去一一在你的代碼是崩潰:
讓我們把一些名字我們的線程,所以我們很容易理解:
1)ThreadA - 遇到你的調度語句s(這也可以是主線程,但爲了解釋的目的,我覺得它更好)
2)ThreadB - 當您提交某個任務時創建的全局線程。
3)ThreadMain - 主線程

實例A:
DispatchQueue.main.async - ThreadA中來,並執行該語句,並把你的塊ThreadMain和移動(因爲它的異步)後的後續步驟塊。

現在讓我們來談談ThreadMain,它會從這裏做些什麼。由於ThreadMain獲得了一個塊(由ThreadA提交),它開始逐步執​​行,並突然看到'DispatchQueue.main.sync'並將內部塊提交到相同的TheradMain隊列並保持onnnnn waitingggggg(自其同步以來)。所以從字面上看,你正在使ThreadMain陷入僵局。

+0

main.async在後臺執行任務,並且不會與MainThread同步工作,我是否正確?? ... –

+0

感謝您的幫助,我發佈了我的最後的結論..好心檢查它.. –