Я пытаюсь создать одноэлементный класс для метеорологических функций (все охвачены), чтобы я мог изменять/обновлять/обновлять данные о погоде на всем моем приложении в одном выделенный объект.Использование 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 погода). Призывы к журналу даже не попадают (поэтому я предполагаю, что методы делегата не попадают).
Любой вход был бы ВЕЛИКОЙ оценен! Спасибо!
Правильно, за исключением устройств, работающих под управлением IOS <5, как указано в первоначальном вопросе ... В принципе, вы в конечном итоге использовать оба метода, если вы хотите, чтобы ваше приложение для запуска на более старые версии iOS ... это была моя проблема. – dcinzona