我希望能够与网络服务同步一些数据。对于每个项目,我必须进行异步调用。
我想要一个完成块,在每个项目同步完成时被调用。对于每个项目,我都可以执行一个完成块。现在,我不知道如何做到这一点。
这是接口:
但我认为这是一种相当糟糕的方式。有什么好的想法吗?
我想要一个完成块,在每个项目同步完成时被调用。对于每个项目,我都可以执行一个完成块。现在,我不知道如何做到这一点。
这是接口:
-(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);
但我认为这是一种相当糟糕的方式。有什么好的想法吗?
waitUntilDone:
的方式执行该方法可能行不通。为了避免在不同线程中减少共享内存,我可以在串行调度队列中执行Chris Devereux的解决方案中的块,但这也是不好的吗? - Obenland