一部のデータを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);
しかし、これはかなり悪い方法だと思います。何か案は?