在 dispatch_group_async 点,它在执行带有回调的异步任务时认为任务已完成

Posted

技术标签:

【中文标题】在 dispatch_group_async 点,它在执行带有回调的异步任务时认为任务已完成【英文标题】:at point dispatch_group_async considers the task done when it is executing async task with callbacks 【发布时间】:2015-03-03 05:39:59 【问题描述】:

我同时发出三个 async 请求,所有这些请求都需要等待才能继续。

我已阅读以下内容以同步异步请求

Waiting until two async blocks are executed before starting another block

dispatch_group_async(group, queue, ^ 
...
);

运行任务异步。但我的任务本身async,它调用回调处理程序。

那么,我的任务什么时候会在dispatch_group_async的上下文中被宣布为done

当我的回调被执行时它会被调用完成吗?

如果你能提供在我的任务被宣布完成之前会发生的事件顺序将会非常有帮助

【问题讨论】:

“我的任务”是什么意思 - dispatch_group 中的异步任务?正在 dispatch_group 上分派任务的任务? 将在 dispatch_group_async 中执行的块将有异步 n/w 请求 因此,一旦块将异步网络请求排队,该任务将继续释放 dispatch_group,因此从 dispatch_group 的角度来看(以及执行 dispatch_group_notifydispatch_group_wait)即使网络活动仍在后台继续,任务也将完成。 是的,这是满足您要求的一种方式 【参考方案1】:

如果您在 dispatch_group_async 中分派一个异步任务,例如“任务 B”,例如“任务 A”,那么即使任务 B 到达任务 A 块的末尾,任务 A 也会被视为完成可能仍在执行。

所以,给定

dispatch_async_group(group,queue, ^ 
      [someAsyncTask B];
);

dispatch_async_group(group,queue, ^ 
      [someAsyncTask C];
);

dispatch_async_group(group,queue, ^ 
      [someAsyncTask D];
);

dispatch_group_wait(group,10000);

dispatch_group_wait 将在最终的 dispatch_async_group 块完成执行后立即返回,即使任务 B/C/D 可能仍在运行。

如果您对任务 B/C/D 使用同步调度,那么您的调度组将在 B、C 和 D 完成后被视为完成。

【讨论】:

以上是关于在 dispatch_group_async 点,它在执行带有回调的异步任务时认为任务已完成的主要内容,如果未能解决你的问题,请参考以下文章

嵌套的异步回调

队列组用于多个网络请求

GCD的常见用法

dispatch_group的踩坑

[OC] 线程 dispatch_group_t

GCD实现多个网络请求同步执行