Правильный метод для обновления MKMapView
Я использую CLGeocoder
чтобы получить координаты GPS для местоположений, загруженных из веб-интерфейса API. Прямо сейчас я подсчитываю количество загруженных записей и обновляю MapView после того, как я повторил этот цикл столько раз. Это работает, но кажется, что должен быть более элегантный / эффективный метод для этого.
Есть мысли о том, как лучше всего это сделать?
- (void) getCoordinatesForTheseLocations:(NSArray*) meetRecords
{
NSInteger countOfAnnotations = [meetRecords count];
if (debug==1) NSLog(@"countOfAnnotations equals %ld", (long)countOfAnnotations);
NSInteger __block iCount = 0;
for (NSDictionary* meet in meetRecords) {
{
NSString *location = [NSString stringWithFormat:@"%@, %@, %@",
[[meet objectForKey:MEET_VENUE] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]],
[[meet objectForKey:MEET_CITY] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]],
[[meet objectForKey:MEET_STATE_ABBREV] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]];
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:location completionHandler:^(NSArray *placemarks, NSError *error) {
CLLocationCoordinate2D coordinates;
CLPlacemark* bestGuess;
if (error) {
….} else if(placemarks && placemarks.count > 0) {
NSMutableDictionary* meetInfoForAnnotation = [[NSMutableDictionary alloc] init];
if (debug==2) NSLog(@"meet = %@", meet);
meetInfoForAnnotation = [meet mutableCopy];
if (debug==2) NSLog(@"Received placemarks: %@", placemarks);
bestGuess = [placemarks objectAtIndex:0];
coordinates.latitude = bestGuess.location.coordinate.latitude;
coordinates.longitude = bestGuess.location.coordinate.longitude;
[meetInfoForAnnotation setObject:[NSNumber numberWithDouble:coordinates.longitude] forKey:MEET_LONGITUDE];
[meetInfoForAnnotation setObject:[NSNumber numberWithDouble:coordinates.latitude] forKey:MEET_LATITUDE];
[self mapAnnotations:meetInfoForAnnotation];
}
if (iCount == countOfAnnotations - 1) { //Update mapView if this is true
dispatch_async(dispatch_get_main_queue(), ^{
myPinColor = MKPinAnnotationColorPurple;
[self setAnnotations:self.meetAnnotations];
});
}
if (debug==1) NSLog(@"iCount = %d and countOfAnnotations = %d",iCount, countOfAnnotations);
iCount ++; //Increment counter whether are successful or have an error.
}];
}
}
1 ответ
Решение
Ответ оказывается простым. Никогда не пытайтесь изобретать велосипед! В итоге я использовал API, похожий на API Zip Code Distance. Затем я могу отфильтровать адреса по почтовому индексу и остаться в пределах ограничений на загрузку.