Ожидание завершения CLGeocoder при параллельном перечислении - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть следующий бит кода в методе класса

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

После выполнения этого кода я хочу вернуть массив shopLocations в качестве результата для метода. Однако мне нужно как-то подождать, пока все поиски геокодера не завершатся, если я не хочу, чтобы массив был пустым.

Как я могу это сделать?

Я пробовал разные подходы GCD, но пока не достиг успеха.

1 Ответ

6 голосов
/ 28 марта 2012

Это может быть обработано функциями dispatch_group _... :

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

…

Я использую блоки такого типа для накопления некоторых сетевых запросов.

Я надеюсь, что это может помочь.

...