IOS 递归分派异步

IOS recursive dispatch async

我正在使用 xcode6 和 ARC。

我有一个包含登录信息的登录故事板。 我有一个登录过程,希望在后台(其他线程)运行。 太酷了,我正在使用 :

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// Call Async URL
});

但我遇到了一些困难,主要是因为我必须调用多个异步 URL。

所以没问题,我试着实现这个:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
  dispatch_semaphore_t sema = dispatch_semaphore_create(0);
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    // Call Async URL withcallback block
    // In block
    dispatch_semaphore_signal(sema);
  });
  // Wait 30 seconds max to finish
  dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 30*10^9));

  sema = dispatch_semaphore_create(0);
  // check if is ok to continue

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    // Call Async URL withcallback block
    // In block
    dispatch_semaphore_signal(sema);
  });
  // Wait 30 seconds max to finish
  dispatch_semaphore_wait(sema, dispatch_time(DISPATCH_TIME_NOW, 30*10^9));
});

可以这样做还是有其他方法?

编辑:我必须做的不仅仅是 2 个调用,递归所有异步调用会很麻烦。

我不确定您是否需要将事情复杂化到这种程度。您 dispatch_async 属于同一个队列,并且表明您正在进行的调用本身是异步的。

假设 // Call Async URL withcallback block 表示您正在进行的调用也是异步的,并采用在完成时执行的回调块,您上面的所有源代码都可以替换为以下内容:

[<some async call> block:^{
  [<some other async call> block:^{
  }];
}];

这里回答晚了,但我想你想看看 DispatchGroups。 DispatchGroup 进入,离开,通知。这将让您等待多个块完成,并在完成时在队列中收到通知。