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 进入,离开,通知。这将让您等待多个块完成,并在完成时在队列中收到通知。
我正在使用 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 进入,离开,通知。这将让您等待多个块完成,并在完成时在队列中收到通知。