0

バックグラウンドでコードを実行するために GCD を使用しています。操作は数秒で終了し、最後には期待どおり「DONE」が出力されます。ただし、hud が非表示になるまで、5 秒 (シミュレーター) から 1 分 (デバイス) まで待つ必要があります。このような長い遅延の理由は何でしょうか? すべての要素の結果を見ることができるので、処理が完了したことがわかります。

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeAnnularDeterminate;
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0);

NSArray *keys = [NSArray arrayWithArray: [codePositions allKeys]];
for (id key in keys) {
    if (key == nil)
        continue;
    dispatch_group_async(group, queue, ^{
        ... // processing
        NSLog(@"Element %d result: %@", element.id, element.result);
        hud.progress += 1.0/96.0;
    });
}
dispatch_group_notify(group, queue, ^{
    NSLog(@"DONE");
    [hud hide:YES];
});

御時間ありがとうございます。

4

1 に答える 1

3

メイン スレッドですべての UI 更新を実行する必要があります。次のようにコードを更新します。

for (id key in keys) {
    if (key == nil)
        continue;
    dispatch_group_async(group, queue, ^{
        ... // processing
        NSLog(@"Element %d result: %@", element.id, element.result);
        dispatch_async(dispatch_get_main_queue(), ^{
            hud.progress += 1.0/96.0;
        });
    });
}
dispatch_group_notify(group, queue, ^{
    NSLog(@"DONE");
    dispatch_async(dispatch_get_main_queue(), ^{
        [hud hide:YES];
    });
});
于 2013-05-21T16:30:59.413 に答える