2017-08-14 10 views
2

私のアプリケーションで実行する必要がある非同期のネットワークタスクがいくつかあります。サーバーから取得する必要があるリソースが3つあり、AB、およびCとします。 BまたはCのいずれかを取得する前に、まずリソースAの取得を完了しなければならないとします。場合によっては、最初にBを取り込み、他の時はCを先に取り出すことがあります。すぐに非同期タスクを実行する

は今のところ、私はちょうどそのような長鎖の閉鎖を持っている:

func fetchA() { 
    AFNetworking.get(completionHandler: { 
    self.fetchB() 
    self.fetchC() 
    }) 
} 

これは今のところ動作しますが、明らかな制限は、私が完了ハンドラに実行順序をハードコーディングされてきていますfetchA。今、私は唯一のfetchBfetchCは、その完了ハンドラに仕上がっているしたいと言っ行うにはいくつかの魔法の方法がある場合は、私が知りたいのですが、基本的に

... fetchBのための私の実装を変更行かなければならないだろう以下のようなもの:

let orderedAsync = [fetchA, fetchB, fetchC] 
orderedAsync.executeInOrder() 

fetchAfetchB、およびfetchCは、すべての非同期機能ですが、fetchAはそうで終了してしまうまでfetchBは実行されません。ありがとう!

+1

AFNetworkingではなくAlamofireの使用を検討することもできます。それは同じ著者によるものですが、迅速な解決策です。しかし、依然として非同期タスク、PromiseKit、要求をラップするための非同期の 'Operation'サブクラス、または同様のものを処理するために何かを行う必要があります。 – Rob

+0

AFNetworkingの中にいた場合は、少しNSOperationラッパーを実行しました。https://github.com/robertmryan/AFHTTPSessionOperation – Rob

答えて

2

は1つだけ実行ブロックが一度に実行されるようになりますDispatchGroup.enter()DispatchGroup.leave()DispatchGroup.modify()と混合シリアルDispatchQueueを使用することができます。あなたがPromiseKitを使用し、サードパーティのライブラリを使用することを許可されている場合

let serialQueue = DispatchQueue(label: "serialQueue") 
let group = DispatchGroup() 
group.enter() 
serialQueue.async{ //call this whenever you need to add a new work item to your queue 
    fetchA{ 
     //in the completion handler call 
     group.leave() 
    } 
} 
serialQueue.async{ 
    group.wait() 
    group.enter() 
    fetchB{ 
     //in the completion handler call 
     group.leave() 
    } 
} 
serialQueue.async{ 
    group.wait() 
    group.enter() 
    fetchC{ 
     group.leave() 
    } 
} 

はそれとも、それが取り扱い、特に連鎖の非同期メソッドGCDが提供する何よりも道が容易になります。詳細は、official GitHubページを参照してください。あなたは約束で完了ハンドラで非同期メソッドをラップし、このようにそれらを一緒に連鎖することができ :

Promise.wrap(fetchA(completion:$0)).then{ valueA->Promise<typeOfValueB> in 
    return Promise.wrap(fetchB(completion:$0) 
}.then{ valueB in 

}.catch{ error in 
    //handle error 
} 

また、すべてのエラーがあなたの約束を介して伝播されています。

+1

fetchA/B/C自体が非同期の場合には動作しません。 – dan

+1

DispatchGroupを含む解決策は、今それは確かに動作します。代替案としてPromiseKitも提供されています。 –

+0

約束は行く方法です! –

関連する問題