2013-06-22 5 views
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); 

так ждать каждую координату загрузки (для каждого объекта), прежде чем бросить курить метод (пожар обработчик).

Thnaks для всех sugestions.

ответ

1

Поддерживать счет всех задач. Когда это будет ноль, все готово.

0

Попробуйте глобальный флаг. сначала установите NO. В блоке загрузки, после того, как вы установили флаг полной загрузки, да. Вы можете проверить этот флаг.

+0

Это решение будет одобрено, если у меня будет только один запрос на геокодирование. Но для нескольких это не работает. – edzio27

+0

принять глобальную переменную и присвоить ее по общему количеству. из загрузок, когда загрузка завершается, просто уменьшайте переменную на 1. Вы можете проверить значение этой переменной, если ее 0, а затем все загрузки ура завершены. – keen

1

Предполагая, что вы используете dispatch_async в downloadLocationWithString: на параллельную очереди:

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

(Если вы используете последовательные очереди, просто вызовите обработчик на последнюю строку последнего блока)