CoreLocationのジオコーダーを使用して、複数のマップアイテムのCLLocation座標を取得しています。ジオコーダーは、各アイテムの完了時に完了ブロックを呼び出します。
非同期ジオコーダー呼び出しを含むこれらすべてが完了したときに呼び出される同様のブロック機能を作成するにはどうすればよいですか?(手動カウンターを使用することもできますが、より洗練されたソリューションが必要です)
これが私のこれまでのジオコーディング機能です。ロケーションアイテムの配列をループし、それぞれに対して新しいジオコーディングプロセスを開始します。
-(void)geoCodeAllItems {
for (EventItem* thisEvent in [[EventItemStore sharedStore] allItems]) {
if (![thisEvent eventLocationCLLocation]){ //Only geocode if the item has no location data yet
CLGeocoder *geocoder = [[CLGeocoder alloc]init];
[geocoder geocodeAddressString:[thisEvent eventLocationGeoQuery] completionHandler:^(NSArray *placemarks, NSError *error) {
if (error){
NSLog(@"\t Geo Code - Error - Failed to geocode";
return;
}
if (placemarks)
{
if ([placemarks count] > 1) NSLog(@"\t Geo Code - Warning - Multiple Placemarks (%i) returned - Picking the first one",[placemarks count]);
CLPlacemark* placemark = [[CLPlacemark alloc]initWithPlacemark:[placemarks objectAtIndex:0]];
CLLocationCoordinate2D placeCoord = [[placemark location]coordinate];
[thisEvent setEventLocationCLLocation:[[CLLocation alloc]initWithLatitude:placeCoord.latitude longitude:placeCoord.longitude]];
[[EventItemStore sharedStore] saveItems];
} else {
NSLog(@"\t Geo Code - Error - No Placemarks decoded");
}
}];
geocoder = nil;
}
}
}
これは基本的には機能しますが、すべてのジオコーディングアクティビティが最終的に終了したのはいつかわからない非同期方式のためです。
私の気持ちは、このためのブロックを作成するか、Grand Central Dispatchを使用する必要があるということですが、よくわかりません。正しいアプローチを見つけるためにこれについて助けてくれてありがとう。