Swift3前提です。
今回僕がやりたかったのは、S3にPUTメソッドで画像をアップロードして、それらが全て完了したらアプリケーションサーバーに投げる、というような処理。
ここではそのGCDにおけるサンプルコードだけ紹介。
Swift3におけるGCDについての詳細は @marty-suzuki さんの記事が良くまとまっているので、そちらを見ると良いかも。
http://qiita.com/marty-suzuki/items/f0547e40dc09e790328f
以下、実コード。
import Alamofire
import Alamofire_SwiftyJSON
let group = DispatchGroup()
// groupの全ての通信
for _ in 0...9 {
group.enter()
Alamofire.request("https://httpbin.org/ip").validate().responseSwiftyJSON(completionHandler: { (response) in
if let json = response.value {
NSLog("json: \(json)");
}else{
NSLog("error: \(response.error)");
}
group.leave()
})
}
// 全ての通信が終わったらやる処理, .main を .global() に変えるとメインスレッド以外の適当なスレッドでyattekureru.
group.notify(queue: .main ) {
if Thread.current == Thread.main {
NSLog("Continue! in Main Thread!")
}else{
NSLog("Oops, in Other Thread! (\(Thread.current))")
}
}
通信エラーが起きた場合についても考慮するなら、もうちょっと複雑になりますが、ここでは割愛。
方針としては、各Alamofire.requestを一つのArrayに保持しておいて、一個でも失敗したら即座に全てのrequestをcancel()
するような形が良いかと思います。 で、一個でもエラーしたものがある場合にtrueになるBoolのフラグ変数でも置いて分岐すれば十分でしょう。