ios - 如何在异步 block 内为 dispatch_group_async dispatch_group_wait

标签 ios objective-c multithreading asynchronous grand-central-dispatch

我的代码看起来像这样:

[SVProgressHUD show];
[imageGenerator generateCGImagesAsynchronouslyForTimes:times
                completionHandler:^(CMTime requestedTime, ...) {
                    dispatch_group_async(queueGroup, queue, ^{
                        // Do stuff
                });
}];

dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER);
[SVProgressHUD dismiss];

基本上,显示加载动画 HUD 并开始从 Assets 生成图像缩略图,然后在完成后隐藏 HUD。我正在使用调度组,因为我想确保在隐藏 HUD 之前生成所有缩略图。

但是当我运行它时,HUD 会立即消失。我猜这是因为 generateCGImagesAsynchronouslyForTimes: completionHandler:--dispatch_group_wait 的异步性质在 completionHandler 中的第一个 dispatch_group_async 之前被调用.

解决这种情况的优雅方法是什么?谢谢。

最佳答案

将此方法视为线程可用的静态计数器,因此当您进入一个组时,计数器递增,而当该 block 返回时,递减...

当那个计数器为0时,它会调用一个 block 来调用

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();

while(someCondition)
{
    dispatch_group_enter(group);
   [SomeClassThatLoadsOffTheInternet getMyImages:^{

        // do something with these.
        dispatch_group_leave(group);

    });
}

dispatch_group_notify(group, queue, ^{
    // do something when all images have loaded
});

这是你的想法吗?

关于ios - 如何在异步 block 内为 dispatch_group_async dispatch_group_wait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133770/

相关文章:

java - 为什么ExecutorService接口(interface)没有实现AutoCloseable?

ios - 在我停止 Beta 测试后,运行 Beta 版的人是否对应用内购买收费(已选择“不可用于测试”)

ios - 无法让 iad/adMob 在设备上进行中介

ios - UIScrollView 自动布局 - 仅垂直滚动

IOS 10 语音识别 API : Error Domain=kAFAssistantErrorDomain Code=1101

ios - 显示来自 URL iOS 的图像

ios - 如何从日期时间格式检索 NSDate?

Objective-C:检查类类型,最好使用 isKindOfClass 或 respondsToSelector?

java - 快餐程序、多线程和信号量Java

java - 如何优先考虑在信号量中等待的线程?