我正在使用 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,但我不太确定。我感谢任何帮助以找到正确的方法。