iOSでの非同期処理の同期化
iOSでネットワークから取得した値を返り値として利用する場合、非同期処理の完了(サーバからのデータ取得)を待ってその値を使う必要があり、私はそのためにセマフォを使って処理の完了を待っていますがうまくいかないことがあったので質問します。
下記メソッドでセマフォを使った所、アプリが止まってしまったので、その対策方法を知りたいです。
デバッガでアプリが止まった部分を確認してみると、AFNetworkingのsessionManagerのGETメソッドを行った直後で止まっています、サーバの処理は完了しているので、ブロックの処理の所でアプリが停止してしまっている様です。
- (BOOL)checkUpdate {
__block BOOL needUpdate = NO;
// セマフォを使うことで非同期処理を同期処理にする
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[[APIClient sharedClient] checkUpdateWithCompletion:^(NSDictionary *result, NSError *error) {
if (error) {
NSLog(@"失敗: %@", error);
} else {
// サーバの結果を取得
needUpdate = [result[@"result"] boolValue];
}
dispatch_semaphore_signal(semaphore);
}];
// ブロックの完了を待つ
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return needUpdate;
}
もし原因わかる方いましたらご教授お願いします。