Прямое геокодирование с проблемами CLGeocoder - PullRequest
2 голосов
/ 13 января 2012

У меня проблема с использованием прямого геокодирования на iOS5 с функцией geocodeAddressString.

У меня есть MKMapView, открытый как модальное представление для отображения разных мест с данными, полученными из Интернета. Моя проблема, когда я отклоняю модальное представление, и затем открываю это снова. Со второй попытки только около половины моих аннотаций фактически размещаются на карте. С третьей попытки никто не появляется.

Я чувствую, что моя проблема здесь связана с управлением памятью и областью применения CLGeocoder, но я просто не могу понять это.

Я создаю все свои аннотации в функции ViewDidLoad контроллера представления, содержащего MapView. Вот код, который я использую для получения координат адресов:

int locationCount = 0;
for(NSDictionary *date in locations)
{
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder geocodeAddressString:[NSString stringWithFormat:@"%@, %@", [date objectForKey:@"venue"], [date objectForKey:@"location"]] completionHandler:^(NSArray *placemarks, NSError *error)
    {
        // if we find the exact location (including the venue string), create an annotation for the map
        if(placemarks && placemarks.count > 0)
        {
            CLPlacemark *topResult = [placemarks objectAtIndex:0];
            TourAnnotation *placemarkAnnotation = [[TourAnnotation alloc] initWithLocation:topResult.location andDetails:date];
            placemarkAnnotation.tag = locationCount;
            [tourMap addAnnotation:placemarkAnnotation];
        }
        // if not place an annotation at the center of the city
        else
        {
            [geocoder geocodeAddressString:[date objectForKey:@"location"] completionHandler:^(NSArray *placemarks, NSError *error)
             {
                 if(placemarks && placemarks.count > 0)
                 {
                     CLPlacemark *topResult = [placemarks objectAtIndex:0];
                     TourAnnotation *placemarkAnnotation = [[TourAnnotation alloc] initWithLocation:topResult.location andDetails:date];
                     placemarkAnnotation.tag = locationCount;
                     [tourMap addAnnotation:placemarkAnnotation];
                 }
             }];
        }
    }];
    ++locationCount;
}

Любые предложения будут оценены.

1 Ответ

0 голосов
/ 19 апреля 2013

Если из-за проблем с памятью вы рассматривали, как аннотации удаляются и используются повторно, в представлении карты есть метод делегата, чтобы сделать это.

Этот урок может помочь.

Учебник по карте Рэя Вендерлиха

...