我异步下载一些对象,我将它存储在数组中。接下来为每个对象下载一些带有地理编码的坐标(它也是异步的),并使用新的坐标参数为每个对象更新我的数据库。我的方法如下:
- (void)downloadObjectsWithTitle:(NSString *)title andHandler:(void(^)(NSMutableDictionary *result))handler {
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"GET"
path:nil
parameters:nil];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
[httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
//I get here array of objects
//now for each object I want to download geocoding localization so i called another asynchronyous method getLocationWithTitle:andHandler;
for(int i = 0; i < resutArray.count; i++) {
[self downloadLocationWithString:[dictionary objectForKey:@"string"] andHandler:^(NSMutableDictionary *result) {
//update database;
}];
}
handler(dictionary);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
[operation start];
}
我的问题是如何为每个对象和火灾下载坐标:
handler(dictionary);
所以在退出方法(消防处理程序)之前等待每个坐标下载(对于每个对象)。
所有sugestions的Thnaks。
答案 0 :(得分:1)
假设您在并发队列的dispatch_async
中使用downloadLocationWithString:
:
dispatch_barrier_async(queue, ^{
// will only be called after all the blocks submitted to queue have finished.
}];
(如果您正在使用串行队列,只需在最后一个块的最后一行调用处理程序)
答案 1 :(得分:1)
保持所有任务的计数。当它为零时,你已经完成了。
答案 2 :(得分:0)
尝试全局标志。先设置NO。在下载块中,下载完成后设置标志为yes。你可以检查那个标志。