Concurrency Grand Central Dispatch,Dispatch queue:枚举数组并为每个元素创建许多并发任务

Concurrency Grand Central Dispatch,Dispatch queue:枚举数组并为每个元素创建许多并发任务,concurrency,objective-c-blocks,grand-central-dispatch,Concurrency,Objective C Blocks,Grand Central Dispatch,所以,我有一个数组(从核心数据获取结果)。 我希望迭代它,并为数组的每个元素(url和其他数据)创建一个新的并行任务(网络)。 只有在完成所有这些任务后,才需要启动新的并行任务 告诉我怎么做?串行队列?调度队列?我这样做的一个有趣方法是使用调度组。你可以说: dispatch\u group\u t myGroup=dispatch\u group\u create(); 然后,对于每个操作,您需要跟踪呼叫: dispatch\u group\u enter(myGroup); 在完成块内部

所以,我有一个数组(从核心数据获取结果)。 我希望迭代它,并为数组的每个元素(url和其他数据)创建一个新的并行任务(网络)。 只有在完成所有这些任务后,才需要启动新的并行任务


告诉我怎么做?串行队列?调度队列?

我这样做的一个有趣方法是使用调度组。你可以说:

dispatch\u group\u t myGroup=dispatch\u group\u create();

然后,对于每个操作,您需要跟踪呼叫:

dispatch\u group\u enter(myGroup);

在完成块内部,将其称为完成块的最后一行:

dispatch\u group\u leave(myGroup);

最后,请致电:

dispatch\u group\u notify(myGroup,dispatch\u get\u main\u queue()^{
//在调度组离开(myGroup)呼叫次数之后启动任务
//等于dispatch_group_enter(myGroup)呼叫数
});


在我目前正在开发的一个应用程序中,这对我来说是一个具有挑战性的问题,它的效果非常好。需要注意的一些事情:确保您不调用enter而不是leave,否则将永远不会调用notify。此外,如果调用leave的次数太多,应用程序将崩溃,因为您将引用一个已被通知并因此被释放的组。我通常通过在一个单独的循环中调用enter来防止这种情况的发生,然后启动完成了leave调用的网络任务。这可能没有必要,但它让我感到更安全的是,我所有的进入都是在任何离开之前被调用的,因此在最后一次完成之前,进入和离开的数量永远不会相等。干杯

使用
枚举对象选项:使用block:
和pass选项
NSEnumerationConcurrent

而不是手动调用
enter
leave
,您可以调用
dispatch\u group\u async
,并使用一个要执行的块,它将为您调用它们。这不起作用,因为OP希望将下一次枚举延迟到网络任务完成为止。本质上,他们需要异步枚举。