1

我有几个异步调用,我会在一个调用中合并:

-(void) loadA:(ArrayBlock)completion failure(FailureBlock):failure;
-(void) loadB:(ArrayBlock)completion failure(FailureBlock):failure;
-(void) loadC:(ArrayBlock)completion failure(FailureBlock):failure;

使用上述调用的组合方法:

- (void) loadAll:(ObjectBlock)completion;

完成块包含一个具有三个数组的对象,称为array[A-C]. 如果任何子调用失败,则对象中的相应数组被简单地设置为 nil。

而不是嵌套这三个块并在前面的失败或完成时调用下一个(这真的很混乱) - 我想使用 GCD 执行以下操作:

  1. 将所有呼叫添加到队列
  2. 等到所有调用完成(调用成功或失败块)
  3. 合并完成块的所有结果并调用方法的完成块loadAll

我知道这在具有同步调用的 GCD 中是可能的,但我不知道如何通过我的三个异步“子调用”来实现这一点。

4

1 回答 1

3

阅读调度组 - 您可以对它们进行同步等待。真的,混乱是错误的词 - 有点复杂可能会更好地说明它。我在嵌套调度块和使用组等待中间结果方面非常幸运。您还可以使用 dispatch_async_barrier 来防止已经在队列中的块在该块被执行之前完成。块也可以将块添加到它们的调度队列中!

我记得存在依赖关系,但我现在在 CGD 文献中找不到该部分。

我真正建议你做的是用铅笔在一张纸上画出来,一旦你说服自己,你就会知道它是如何工作的,然后开始编码。

于 2012-07-31T22:45:09.723 回答