LoginSignup
10
11

More than 5 years have passed since last update.

DispatchGroupを使って複数の処理を待ってメインの処理に戻す

Posted at

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のフラグ変数でも置いて分岐すれば十分でしょう。

10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11