Использование 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);
}
}];