2017-05-16 9 views
1

私は非同期および同期メカニズムを初めて使用しています。 私のコードでは、もう一方のコード行が実行された後で1つのコード行を実行する必要があります。Swiftで他のコードが実行された後に1つのコードを実行する方法

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-tutorial-swift-3-part-1)を参照してください。あなたは確かに自分自身で答えを見つけるでしょう: –

+0

行が順番に実行される、問題は何ですか? 'getInfoFromTheWeb'は非同期ですか?あなたはすでに同期要求を実行できる別のスレッドにいます。つまり、 'saveToDB'に達すると、Web情報はすでに存在しています。 – luk2302

+0

あなたのコンセプト/問題は完了ハンドラの使用に関連していると思います[ここ](https://grokswift.com/completion-handlers-in-swift/)はそれのための素晴らしいチュートリアルです! –

答えて

3

をあなたがすべきDispatchGroup それは次のようになります。 DispatchGroupを使用すると、1つの関数/行のコードは、他の関数の実行が完了するまで待機します。例えば

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

これは間違いなく、infoがnilの場合に何らかのタスクを実行する必要がある場合、Elseステートメントを持つことができます。 – Bobby

関連する問題