2017-02-25 85 views
0

下面的代碼不會打印..In Background..並打印..Executing..雨燕3.0異步Dispatch.global不運行

我知道我缺少真正的基本的東西。我用相同的方式閱讀了其他問題,但他們似乎都在運行相同的代碼。

一些可能重複沒有幫助here

我已經提取了確切的代碼有問題,我覺得沒有什麼更多的是需要幫助調試這一點。

func execute() { 
     print("..Executing..") 
     DispatchQueue.global(qos: .background).async { 
      self.doInBackground() 

      DispatchQueue.main.async { 
       self.doAfterBackgroundCompletes() 
      } 
     } 
    } 

func doInBackground() { 

     print("..In Background..") 

編輯

下面的作品。但我想知道不應該在後臺線程中的http請求。如果http請求不在後臺線程中,至少在Android中會引起問題。

func execute() { 
     print("..Executing..") 
     self.doInBackground() 
     self.doAfterBackgroundCompletes() 

//  DispatchQueue.global(qos: .background).async { 
//   DispatchQueue.main.async { 
//    self.doInBackground() 
//    self.doAfterBackgroundCompletes() 
//   } 
//  } 
    } 

回答

1

這是工作代碼。

DispatchQueue.global().async(execute: { 

    print("global...") 

    DispatchQueue.main.sync{ 
     print("main...") 
    } 

}) 
2

也許我錯過了什麼? 我只是跑下面的代碼:

func execute() { 
    print("..Executing..") 
    DispatchQueue.global(qos: .background).async { 
     self.doInBackground() 

     DispatchQueue.main.async { 
      self.doAfterBackgroundCompletes() 
     } 
    } 
} 

func doInBackground() { 
    print("..In Background..") 
} 

func doAfterBackgroundCompletes() { 
    print("..COMPLETED..") 
} 

而且結果是:

..Executing.. 
..In Background.. 
..COMPLETED.. 

從你在哪裏調用execute功能?

2

我在Swift 4中看到過相同的行爲。雖然我無法解釋它,但將QoS從.background更改爲.default確實執行並解決了我的問題。我知道這不是一個解決方案,但我希望這是一個合理的解決方案。

0

我也有這個問題,並通過創建一個自定義調度隊列來解決它,但我相信它可以通過增加任務優先級來緩解(如果不是直接解決的話)。

我認爲問題在於全局調度隊列被很多事情使用,全局隊列的併發任務數量有限。通過在.background隊列中添加任務,只有在沒有.utility或更高優先級的任務時,您的項目纔會運行。

由於某種原因,有很多優先級較高的任務正在排隊,或者碰巧正在花費過多的時間,這就成了一個問題。這可能是任何隊列中的問題,儘管全局隊列可能更容易出現此問題,因爲更多的事情會使用它。

這是Apple's docs,將創建和管理調度隊列標題下:

在任何時刻由併發隊列中執行任務的實際數量是可變的,可以在條件動態地改變你的應用程序更改許多因素會影響併發隊列執行的任務數量,包括可用核心數量,其他進程執行的工作量以及其他串行調度隊列中的任務數量和優先級。

...

正如你所預料的,在高優先級隊列的併發任務的默認和低優先級隊列之前執行。同樣,默認隊列中的任務在低優先級隊列中的任務之前執行。