我正在使用带有ARC的xcode6。
我有登录故事板和登录信息。 我有一个希望在后台运行的登录过程(其他线程)。 很酷'我正在使用:
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次通话,递归我所有的异步电话会很麻烦。
答案 0 :(得分:2)
我不确定你是否需要这么复杂化。您dispatch_async
到同一个队列,并且您表明您正在进行的通话本身是异步的。
假设// Call Async URL withcallback block
表示您正在进行的调用也是异步的,并且在完成后执行它执行的回调块,上面的所有源代码都可以替换为以下内容:
[<some async call> block:^{
[<some other async call> block:^{
}];
}];
答案 1 :(得分:0)
这里的答案很晚,但我想你想看一下DispatchGroups。 DispatchGroup进入,离开,通知。这将允许您等待多个块完成,并在完成后通知队列。