2012-07-13 161 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]]; 
    } 
} 

根據您的需求,你可以使用這個來阻止,並叫你回來,把它放在一個線程,並繼續做的東西,給你回電話。