もっとよい解決方法
こちらを参照して下さい。
概要
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秒毎の処理なので、処理が止まらない
}
・・・後続の処理・・・