Использование MKReverseGeocoder в одноэлементном классе (ARC)

Я пытаюсь создать одноэлементный класс для погодных функций (включая все), чтобы я мог изменять / обновлять / вызывать данные о погоде во всем моем приложении в одном выделенном объекте.

У меня это работает, за исключением одной маленькой странной ошибки. Я использую MKReverseGeocoder на устройствах под управлением iOS < 5. CLGeocoder отлично работает на iOS 5+. По сути, это то, что происходит в приложении:

В приложении-делегате при запуске я создаю общий экземпляр моего погодного синглтона. Этот экземпляр ничего не делает, если только не существует UIView, который ожидает сообщить о погоде. Когда загружается представление, которое сообщает о погоде, если местоположение не задано статически в настройках, приложение пытается получить ваше текущее местоположение.

Это работает, и я могу записать координаты текущего местоположения устройства. После того, как это сделано, я немедленно пытаюсь изменить геолокацию этих координат. Метод MKReverseGeocoder start действительно выполняется, и я могу зарегистрировать, что свойство isQuerying экземпляра имеет значение true, поэтому я знаю, что он пытается геолокации координат. (Да, я назначил делегата в качестве моего общего экземпляра, а экземпляр имеет тип MKReverseGeocoderDelegate).

Теперь это странная часть. Если я запускаю приложение в первый раз и впервые добавляю UIView погоды на экран, MKReverseGeocoder запускается, но никогда не вызывает метод делегата. Если я затем закрою приложение и снова открою его (второй раз), текущее местоположение будет найдено, и MKReverseGeocoder вызовет методы делегата, и все будет работать. Он просто не хочет работать при первом запуске, независимо от того, сколько раз я его называю (у меня есть кнопка, которая может инициировать поиск).

Это полностью сбивает с толку. IOS 5 CLGeocoder отлично работает при первом запуске и при каждом последующем запуске. MKReverseGeocoder не работает (потому что он не вызывает методы делегата) при первом запуске, но работает при последующих запусках.

Ниже приведен соответствующий код:

-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error{

    NSLog(@"error getting location:%@", error);
    self.reverseGeocoder = nil;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"errorGettingLocation" object:nil userInfo:[NSDictionary dictionaryWithObject:error forKey:@"error"]];

}
- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)pm
{
    //update placemark and get weather from correct placemark
    placemark = pm;
    NSLog(@"singleton placemark: %@",placemark);
    [self getLocationFromPlacemark];
    self.reverseGeocoder = nil;
}


- (void) getReverseGeoCode:(CLLocation *)newLocation
{
    NSLog(@"reversGeocode starting for location: %@", newLocation);
    NSString *ver = [[UIDevice currentDevice] systemVersion];
    float ver_float = [ver floatValue];
    if (ver_float < 5.0) {
        //reverseGeocoder = nil;
        self.reverseGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:newLocation.coordinate];
        self.reverseGeocoder.delegate = self;
        [self.reverseGeocoder start];
        if(self.reverseGeocoder.isQuerying){
            NSLog(@"self.reverseGeocoder querying");
            NSLog(@"self.reverseGeocoder delegate %@", self.reverseGeocoder.delegate);
            NSLog(@"self %@", self);
        }else {
            NSLog(@"geocoder not querying");
        }
    }
    else {
        [reverseGeocoder5 reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error){


            if([placemarks count]>0){
                placemark = [placemarks objectAtIndex:0];
                [self getLocationFromPlacemark];
            }
            else{
                if (error) {
                    NSLog(@"error reverseGeocode: %@",[error localizedDescription]);

                }
            }
        }];

    }
}

Кроме того, я устанавливаю reverserGeocoder как (неатомное, сильное) свойство и синтезирую его. Помните, что это нормально работает после чистого запуска во второй раз (когда уже загружена погода UIView). Призывы к журналу даже не получают удар (именно поэтому я предполагаю, что методы делегата не получают удар).

Любой вклад будет высоко ценится! Спасибо!

2 ответа

Я понял это... ну, вроде. Вместо того чтобы использовать MKReverseGeocoder, я просто делаю статический поиск в Google Maps ala. Как бороться с ошибками MKReverseGeocoder / PBHTTPStatusCode=503 в iOS 4.3?

Работает отлично.

MKReverseGeocoder больше не существует... в iOS 5 Вы должны импортировать CoreLocation и использовать CLGeocoder. Ниже приведен пример кода:

                  CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
        CLLocation *location = [[CLLocation alloc] initWithLatitude:37.33188 longitude:-122.029497];

        [geoCoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemark, NSError *error) {
            CLPlacemark *place = [placemark objectAtIndex:0];
            if (error) {
                NSLog(@"fail %@", error);

            } else {
                NSLog(@"return %@", place.addressDictionary);
            }

        }];
Другие вопросы по тегам