は、UIの更新を行う除外explicitiy私のUIの更新がdispatch_async(dispatch_get_main_queueを()コメントアウトするとこの質問https://stackoverflow.com/a/23155684/1898829は、なぜ私はメインスレッドへの復帰
[[session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response,
NSError *error) {
if (data != nil) {
NSDictionary *responseDictionary =
[NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
// dispatch_async(dispatch_get_main_queue(), ^{
CarListModel *carListModel = [[CarListModel alloc]
initWithArray:responseDictionary[@"placemarks"]];
completion(carListModel, error);
// });
} else {
dispatch_async(dispatch_get_main_queue(), ^{
completion(nil, error);
});
}
}] resume];
に応じてメインスレッド上で実行する必要がありません、^{私のアプリは以前と同じように動作します。テーブルビューが更新され、アクティビティインジケータが停止する
このコンプリートブロックは、ビューコントローラに送られる完了ブロックを持つビューモデルに移動します。メインスレッドに戻る必要があります。
はなぜUIがブロックされていませんか、あなたはUIの更新がメインスレッド上で実行する必要があることを正しい私は明示的に
dispatch_async(dispatch_get_main_queue(), ^{
あなたがメインスレッドに「帰国」されていません。メインスレッドは並行して実行されます。 '-dataTaskWithRequest'は、anthoerスレッド上で実行されるキューを使用します。したがって、メインスレッドをブロックすることはできません。メインスレッドのコードのみがメインスレッドをブロックできます。 –
私のUIの変更はメインスレッドで行われていないのですか?メインスレッドで処理されているのはなぜですか? – user1898829
完了ハンドラをメインキューへのディスパッチの外で実行すると、そのスレッドはメインスレッドの外側で実行されます。私は補完ハンドラのコードを知らないので、どのキューで何が行われるのかは言えません。 –