2012-07-13 163 views
0

我需要执行一些网络调用。我使用NSURLConnection的,但我认为封装到一个新的类,它使用块:如何知道任意数量的异步操作的结束

[MAURLConnection asyncConnectionWithURLString:str 
            completionBlock:^(NSData *data, NSURLResponse *response) { 
             //completed, do something with data returned 

            } 
             errorBlock:^(NSError *error) { 
              //error 
             }]; 
} 

不过,现在我需要调用几个,它们中的一次,但我需要知道什么时候他们都完成。什么是最好的方法来做到这一点?当他们都完成时,我不一定需要进展。

+0

每当作业开始时,增加一个计数器。当每个工作完成时,递减计数器。当计数器为0时,就完成了。 – Almo 2012-07-13 15:27:23

+0

@Almo这意味着你可以增加和减少原子,这是不正确的,除非你使用锁定。 – dasblinkenlight 2012-07-13 15:28:17

+0

绝对如此。 – Almo 2012-07-13 15:52:35

回答

0

最简单的想法是我能想到的是一个计数器。当每个连接完成后,只需增加一个计数器。一旦计数器达到你的号码,你就完成了。您也可以通过某些功能增加计数器,并在计数器号码被击中时运行通知。 这可能是数组的变体,你也可以存储一些关于完成连接的附加信息。

0

Almo的评论的另一个变化是将他们推入队列状结构,完成后队列的长度将为零。要完成非阻塞检查以查看队列是否为空,请使用运行循环。

- (void)waitUntilDone {  
    while (![_queue count] > 0) { 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    } 
} 

根据您的需求,你可以使用这个来阻止,并叫你回来,把它放在一个线程,并继续做的东西,给你回电话。