Причина, по которой местоположение 1 является нулевым, заключается в том, что обратный геокодер не завершил работу при запуске.Все в вашем completionHandler
произойдет после того, как геокодер завершит работу.Оператор журнала для местоположения 1 не является частью этого completionHandler
и выполняется сразу после вызова обратного геокода.Конечным результатом является то, что вызов журнала происходит до , когда вы звоните setCity:andState:
.
Обновление
Вам необходимо установить аннотацию в completionHandler
блок.Код, который появляется в блоке, появляется позже в последовательности и времени, чем остальная часть вашей реализации сообщения locationManager:didUpdateToLocation:fromLocation:
.Вы можете прочитать о блоках из документации Apple или выполнить поиск в Интернете.
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) {
CLPlacemark *placemark = [placemarks objectAtIndex:0];
[self setCity:[placemark locality] andState:[placemark administrativeArea]];
MapPoint *mp = [[MapPoint alloc] initWithCoordinate:[newLocation coordinate]
title:[locationTitleField text]
date:[dateFormat stringFromDate:today]];
[mapView addAnnotation:mp];
}];
}
Окончание обновления
Кроме того, это выглядит так, как будтоВы можете использовать свойства не так хорошо, как могли бы.Поскольку у вас есть свойства city
и state
, вам не нужны переменные экземпляра city
и state
.
Попробуйте изменить его следующим образом:
@interface AppDelegate : UIResponder <UIApplicationDelegate, CLLocationManagerDelegate, MKMapViewDelegate>
{
CLLocationManager *locationManager;
IBOutlet MKMapView *mapView;
}
В реализации:
@synthesize city, state
...
- (void)setCity:(NSString *)c andState:(NSString *)s
{
[self setCity:c];
[self setState:s];
NSLog(@"Location 2: %@, %@", city, state);
}
Вам не понадобятся дополнительные операторы retain, поскольку свойство копирует значение.Вы также должны обязательно позвонить self.city
и self.state
, чтобы получить значения.