Aguardando que o CLGeocoder termine a enumeração simultânea
-
13-11-2019 - |
Pergunta
Eu tenho o seguinte trecho de código em um método de classe
NSDictionary *shopAddresses = [[NSDictionary alloc] initWithContentsOfFile:fileName];
NSMutableArray *shopLocations = [NSMutableArray arrayWithCapacity:shopAddresses.count];
[shopAddresses enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id key, ShopLocation *shopLocation, BOOL *stop) {
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:shopLocation.address completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
NSLog(@"Geocode failed with error: %@", error);
}
else {
shopLocation.placemark = [placemarks objectAtIndex:0];
}
[shopLocations addObject:shopLocation];
}];
}
Após a execução deste código, desejo retornar o array shopLocations como resultado do método.No entanto, preciso esperar de alguma forma até que todas as pesquisas do geocodificador sejam concluídas, se não quiser que a matriz fique vazia.
Como posso fazer isso?
Tentei diferentes abordagens de GCD, mas não obtive sucesso até agora.
Solução
Isto pode ser tratado pelo despacho_grupo_... funções:
…
dispatch_group_t group = dispatch_group_create();
[shopAddresses enumerateObjectsUsingBlock:^(id key, NSUInteger idx, BOOL *stop) {
dispatch_group_enter(group);
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:shopLocation.address completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
NSLog(@"Geocode failed with error: %@", error);
}
else {
shopLocation.placemark = [placemarks objectAtIndex:0];
}
[shopLocations addObject:shopLocation];
dispatch_group_leave(group);
}];
}];
while (dispatch_group_wait(group, DISPATCH_TIME_NOW)) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:[NSDate dateWithTimeIntervalSinceNow:1.f]];
}
dispatch_release(group);
…
Estou usando esse tipo de bloco para acumular algumas solicitações de rede.
Espero que isso possa ajudar.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow