2017-06-04 18 views
1

Iは、succsss追加非同期応答は、3

応答が追加または順序でそれらを連結する必要があるます関数を介して機能にdataTask戻るを使用してAPIからデータを取得するティッカーを生成しますよしかし、私はそれを行うことができません。

ここで私が試したのは、個々のティッカー成功呼び出しが返される前に最後の印刷行が実行されるため、両方とも失敗します。

func getTicker() { 

     var tickerText = "" 

     tickerText += dataRequestnew("https://api-path-here/1") { success in return "First-item: \(success)" } 
     tickerText += dataRequestnew("https://api-path-here/2") { success in return " | Second-item: \(success)" } 

     print(tickerText) 

    } 

または第二の例では

var tickerText = "" 

    func getTicker() { 

     dataRequestnew("https://api-path-here/1") { success in 
      self.tickerText += "First-item: \(success)" 
      print(self.tickerText) 
     } 
     dataRequestnew("https://api-path-here/2") { success in 
      self.tickerText += " | Second-item: \(success)" 
      print(self.tickerText) 
     } 

     print(self.tickerText) 
    } 

、成功した個別銘柄のプリントではなく、最後の一つは、それが唯一のデフォルト値を返します。

質問

にはどうすればいいのシーケンスで、コードの実行を行うことができますか、少なくともすべてのtickerTextコールが正常に返された後、最後の印刷が機能することを確認してください。

ありがとうございました。

答えて

1

オプションとして、最初の応答で2番目の要求を呼び出すことができます。結果を印刷するだけです。

var tickerText = "" 

    func getTicker() { 

     dataRequestnew("https://api-path-here/1") { success in 
      self.tickerText += "First-item: \(success)" 
      dataRequestnew("https://api-path-here/2") { success in 
       self.tickerText += " | Second-item: \(success)" 
       print(self.tickerText) 
      } 
     }  
    } 
+0

これは私の心を越えましたが、私はたくさんのアイテムを持っていれば練習ではありません、その他の提案はどうですか? –

+0

実際、私の意見ではReactiveXのhttps://github.com/ReactiveX/RxSwiftを使用することをお勧めします。 リクエストをデータストリームに変換し、最後に1つの連結応答を持つようにフラットマップすることができます。明確な例をここに実装する方法があります:https://stackoverflow.com/questions/40919920/proper-usage-of-rxswift-to-chain-requests-flatmap-or-something-else –

0

シリアルキュー。そのキューで要求をディスパッチします。

let serialQueue = DispatchQueue(label: "com.mydomain.purpose") 
    serialQueue.async { 
     // some code 
    } 
    serialQueue.async { 
     // some code 
    } 
関連する問題