/ / Oczekiwanie na zakończenie CLGeocoder przy jednoczesnym wyliczaniu - ios5, grand-central-dispatch, clgeocoder

Oczekiwanie na zakończenie CLGeocoder na współbieżnym wyliczaniu - ios5, grand-central-dispatch, clgeocoder

Mam następujący fragment kodu w metodzie klasy

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

Po wykonaniu tego kodu chcę zwrócićtablica shopLocations jako wynik metody. Jednak muszę jakoś poczekać, aż wszystkie wyszukiwania geokodera zakończą się, jeśli nie chcę, aby tablica była pusta.

Jak mogę to zrobić?

Próbowałem różnych metod GCD, ale jak dotąd nie odniosłem sukcesu.

Odpowiedzi:

6 dla odpowiedzi № 1

Można to rozwiązać za pomocą dispatch_group _... Funkcje:

…
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);

…

Używam tego rodzaju bloków do gromadzenia niektórych żądań sieciowych.

Mam nadzieję, że to pomoże.