IOS递归调度异步

时间:2015-02-18 15:55:48

标签: ios multithreading asynchronous nsurlconnection

我正在使用带有ARC的xcode6。

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

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

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

所以没问题,我尝试实现这个: enter image description here

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次通话,递归我所有的异步电话会很麻烦。

2 个答案:

答案 0 :(得分:2)

我不确定你是否需要这么复杂化。您dispatch_async到同一个队列,并且您表明您正在进行的通话本身是异步的。

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

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

答案 1 :(得分:0)

这里的答案很晚,但我想你想看一下DispatchGroups。 DispatchGroup进入,离开,通知。这将允许您等待多个块完成,并在完成后通知队列。