LoginSignup
31
31

More than 5 years have passed since last update.

Alamofireでデータ受信が終わるまで待機する方法

Last updated at Posted at 2015-12-13

もっとよい解決方法

こちらを参照して下さい。

概要

Alamofireでデータ受信するまで待機したいと思って、以下の様なコードを書いたら、アプリが止まってしまいました。
これは、.responseJSONのブロック内と、その外側が同じスレッドで処理されるためらしいです。
つまり、dispatch_semaphore_waitで待機してしまうと、.responseJSONのブロック内も処理が止まってしまい、いつまで経ってもロック解除ができずにデッドロック・・・という事みたいです。

//ロックの取得
let semaphore:dispatch_semaphore_t = dispatch_semaphore_create(0)

Alamofire.request(.POST, url, headers: headers, encoding: .JSON)
    .responseJSON { response in
        ・・・データを受信した際の処理・・・
        //ロックの解除
        dispatch_semaphore_signal(semaphore)
}

//ロックが解除されるまで待つ
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)

・・・後続の処理・・・

解決策

Async Swift Scripting - NSBoganによると、NSRunLoopを使ったテクニックが紹介されています。

//ロックの取得
var keepAlive = true

Alamofire.request(.POST, url, headers: headers, encoding: .JSON)
    .responseJSON { response in
        ・・・データを受信した際の処理・・・
        //ロックの解除
        keepAlive = false
}

//ロックが解除されるまで待つ
let runLoop = NSRunLoop.currentRunLoop()
while keepAlive &&
    runLoop.runMode(NSDefaultRunLoopMode, beforeDate: NSDate(timeIntervalSinceNow: 0.1)) {
    // 0.1秒毎の処理なので、処理が止まらない
}

・・・後続の処理・・・
31
31
1

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
31
31