Правильный метод обновления 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.
        }];
    }
}

person PhillipOReilly    schedule 24.02.2014    source источник


Ответы (1)


Ответ оказывается простым. Никогда не пытайтесь изобретать велосипед! В итоге я использовал API, похожий на Zip Code Distance API. Затем я могу фильтровать адреса по почтовому индексу и не выходить за пределы загрузки.

person PhillipOReilly    schedule 17.04.2014