如何知道任意数量的异步操作的结束
问题描述:
我需要执行一些网络调用。我使用NSURLConnection的,但我认为封装到一个新的类,它使用块:如何知道任意数量的异步操作的结束
[MAURLConnection asyncConnectionWithURLString:str
completionBlock:^(NSData *data, NSURLResponse *response) {
//completed, do something with data returned
}
errorBlock:^(NSError *error) {
//error
}];
}
不过,现在我需要调用几个,它们中的一次,但我需要知道什么时候他们都完成。什么是最好的方法来做到这一点?当他们都完成时,我不一定需要进展。
答
最简单的想法是我能想到的是一个计数器。当每个连接完成后,只需增加一个计数器。一旦计数器达到你的号码,你就完成了。您也可以通过某些功能增加计数器,并在计数器号码被击中时运行通知。 这可能是数组的变体,你也可以存储一些关于完成连接的附加信息。
答
Almo的评论的另一个变化是将他们推入队列状结构,完成后队列的长度将为零。要完成非阻塞检查以查看队列是否为空,请使用运行循环。
- (void)waitUntilDone {
while (![_queue count] > 0) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
}
根据您的需求,你可以使用这个来阻止,并叫你回来,把它放在一个线程,并继续做的东西,给你回电话。
每当作业开始时,增加一个计数器。当每个工作完成时,递减计数器。当计数器为0时,就完成了。 – Almo 2012-07-13 15:27:23
@Almo这意味着你可以增加和减少原子,这是不正确的,除非你使用锁定。 – dasblinkenlight 2012-07-13 15:28:17
绝对如此。 – Almo 2012-07-13 15:52:35