iOS - GCD组和显著的UI延迟完成



我使用GCD在后台运行一些代码。操作在几秒钟内完成,最后按预期打印"DONE"。然而,我必须等待~5秒(模拟器)~1分钟(设备)hud隐藏。延误这么久的原因是什么?我知道处理已经完成,因为我可以看到每个元素的结果。

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];
});

感谢您的宝贵时间。

您需要在主线程上执行所有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];
    });
});

最新更新