2012-04-30 6 views
1

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

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

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

Это работает, и я могу зарегистрировать координаты текущего местоположения устройств. После этого я немедленно пытаюсь изменить геолокацию этих координат. Метод MKReverseGeocoder начинает выполняться, и я могу записать, что свойство isQuerying экземпляра истинно, поэтому я знаю, что он пытается привязать координаты. (Да, я установил делегат как мой общий экземпляр, и экземпляр имеет тип 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 погода). Призывы к журналу даже не попадают (поэтому я предполагаю, что методы делегата не попадают).

Любой вход был бы ВЕЛИКОЙ оценен! Спасибо!

ответ

0

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); 
      } 

     }]; 
+0

Правильно, за исключением устройств, работающих под управлением IOS <5, как указано в первоначальном вопросе ... В принципе, вы в конечном итоге использовать оба метода, если вы хотите, чтобы ваше приложение для запуска на более старые версии iOS ... это была моя проблема. – dcinzona

Смежные вопросы