0

我异步下载一些对象,我将它存储在数组中。接下来为每个对象下载一些带有地理编码的坐标(它也是异步的),并使用坐标的新参数为每个对象更新我的数据库。我的方法如下所示:

- (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];
}

我的问题是如何为每个对象和那火downalod坐标:

handler(dictionary);

所以在退出方法(火灾处理程序)之前等待每个坐标下载(对于每个对象)。

感谢所有的建议。

4

3 回答 3

1

假设您在dispatch_async并发downloadLocationWithString:队列上使用:

dispatch_barrier_async(queue, ^{
    // will only be called after all the blocks submitted to queue have finished.
}];

(如果您使用的是串行队列,只需在最后一个块的最后一行调用处理程序)

于 2013-06-22T07:36:53.993 回答
1

保留所有任务的计数。当它为零时,你就完成了。

于 2013-06-22T07:46:35.773 回答
0

尝试全局标志。先设置NO。在下载块中,下载完成后将标志设置为是。你可以检查那个标志。

于 2013-06-22T07:31:56.543 回答