/ / CLGeocoderが並行列挙で終了するのを待機中 - ios5、grand-central-dispatch、clgeocoder

CLGeocoderが並行して列挙されるのを待つ - ios5、grand-central-dispatch、clgeocoder

クラスメソッドに次のコードがあります。

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

これはによって処理することができます 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);

…

私はこれらの種類のブロックを使っていくつかのネットワーク要求を蓄積しています。

これが助けてくれるといいなあ