我想同步一些數據與Web服務。對於每個項目,我必須進行異步調用。等待許多異步調用執行回調
當每個項目被同步時,我想要調用一個完成塊女巫。對於每個項目,我可以執行完成塊。現在,我不知道如何去做。
這是接口:
-(void) synchronizeItemsOnComplete:(CompleteBlock) block {
NSArray* items = // get items
for (int i = 0, n = [items count]; i < n; i++) {
[self synchronizeItem:[items objectAtIndex:i] onComplete:^{
// What do do here?
}];
}
// And/or here?
}
-(void) synchronizeItemOnComplete:(CompleteBlock) block {
// do something
block();
}
我怎麼能等待同步,然後執行塊?
我想是這樣的:
NSArray* items = // get items
__block int countOfItemsUntilDone = [items count];
for (int i = 0, n = countOfItemsUntilDone; i < n; i++) {
[self synchronizeItem:[items objectAtIndex:i] onComplete:^{
countOfItemsUntilDone--;
}];
}
dispatch_queue_t queue = dispatch_queue_create("wait for syncing", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
while (countOfItemsUntilDone > 0) {
usleep(1000); // wait a little bit
}
block();
});
dispatch_release(queue);
但我認爲這是一個相當不錯的方法。有任何想法嗎?
哦......我沒有說清楚這一點。那叫做synchronizeItemImage方法通過RESTKit啓動一個異步請求。因此,執行異步方法或'waitUntilDone:'可能無效。爲了避免減少不同線程中的共享內存,我可以在串行調度隊列中從Chris Devereux的解決方案執行該塊,或者這也不好? – Obenland 2013-02-25 18:56:29
哦。在這種情況下,只要在主線程上調用完成處理程序,就可以減少一些變量。或者更好的是,在你的windowController或應用程序委託上遞減一個屬性,並使用KVO通知來找出它何時到達零。 – iluvcapra 2013-02-25 19:28:55