2017-05-16 84 views
1

我是新來的異步和同步機制。 在我的代碼中,我必須在另一個完成後才執行一個代碼行。 它看起來是這樣的:如何使一個代碼在另一個在Swift中完成後運行

func something(){ 

    let workerQueue = DispatchQueue.global(qos: .userInitiated) 
      workerQueue.async{ 
     let info = getInfoFromTheWeb()//I need the info value in order to perform the next line 
     saveToDB(info: info) 

     DispatchQueue.main.async { 
     //update a label text in the ui after getting and saving that info 
     } 

    } 
} 

你的專業的想法,請..

+0

剛經歷GCD的概念以及它如何工作[這裏](https://www.raywenderlich.com/148513/grand-central-di spatch-教程迅速-3-部分-1)。你會自己找到答案肯定:) –

+0

行是一個接一個執行的,有什麼問題?是'getInfoFromTheWeb'異步?看起來不是這樣,你已經在一個單獨的線程上,你可以執行同步請求。這意味着當達到'saveToDB'時,Web信息已經存在。 – luk2302

+0

我認爲你的概念/問題與完成處理程序的使用有關[在這裏](https://grokswift.com/completion-handlers-in-swift/)是一個很好的教程! –

回答

3

你應該DispatchGroup。通過使用DispatchGroup,一個函數/一行代碼將等到另一個函數完成執行。

例如

let myGroup = DispatchGroup() 
    myGroup.enter() 
    let info = getInfoFromTheWeb() 

當你從簡單的通話得到info

myGroup.leave() 

當您的通話leave()功能下面的代碼會被執行

myGroup.notify(queue: DispatchQueue.main) { 

      saveToDB(info: info) 
      /// Update UI elements 
     } 
+0

Usman,iOS中的默認是在異步事件中運行代碼? @Usman Javed – Shira

+1

是的,有關更多詳細信息,我建議您詳細閱讀DispatchGroup。 –

0

嘗試是這樣的:

func something() { 

    let workerQueue = DispatchQueue.global(qos: .userInitiated) 
    workerQueue.async{ 

     if let info = getInfoFromTheWeb() { 
      saveToDB(info: info) 
      DispatchQueue.main.async { 
       //update a label text in the ui after getting and saving that info 
      } 
     } 

} 
+0

謝謝,鮑比。如果不是呢? info = getInfoFromTheWeb()。那麼saveToDB()將不會被執行? – Shira

+1

這是正確的,如果信息爲零,如果您需要執行一些任務,則可以有一條Else語句。 – Bobby

相關問題