Переменная экземпляра не сохраняет значение - PullRequest
0 голосов
/ 27 февраля 2012

Я пытаюсь перенаправить геокодирование адреса в iOS 5, используя объект CLGeocoder и помещая полученный CLLocation в переменную экземпляра. По какой-то причине я могу установить переменную экземпляра и затем вызвать ее геттер, но переменная теряет свое значение вне области действия обработчика завершения геокодера.

Я объявил переменную в моем .h файле:

@property (nonatomic, strong) CLLocation *specifiedPosition;

Затем синтезировал его в моем .m:

@synthesize specifiedPosition = _specifiedPosition;

А затем попытался использовать геокодер следующим образом: первый NSLog возвращает широту и долготу, а второй нет:

-(void)getLatLong:(NSString *)locationText
{

if (!self.geocoder)
{
    self.geocoder = [[CLGeocoder alloc] init];
}

[self.geocoder geocodeAddressString:locationText completionHandler:^(NSArray *placemarks, NSError *error){

    if ( ([placemarks count] > 0) && (error == nil)) {

        self.specifiedPosition = [[placemarks objectAtIndex:0] location];
        NSLog(@"Specified Location variable is set to: %@", self.specifiedPosition);


    } else if (error == nil && [placemarks count] == 0){
        // TODO
        NSLog(@"Can't find data on the specificed location");
    }
    else if (error != nil){
        // TODO
        NSLog(@"An error occurred = %@", error);
    }

}];

NSLog(@"Specified Location variable is set to: %@", self.specifiedPosition);

}

Я также попробовал пользовательский установщик, но это не помогло:

-(void)setSpecifiedPosition:(CLLocation *)specifiedPosition
{
    _specifiedPosition = specifiedPosition;
}

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 27 февраля 2012

Я не знаком с этим конкретным API, но тот факт, что он принимает блок с именем completionHandler, очень убедительно говорит о том, что это асинхронная операция.То есть ваш блок будет вызван позже (из цикла выполнения).Ваш второй NSLog в исходном коде происходит до , completionHandler вызывается, поэтому он, конечно, не видит назначение, так как оно еще не произошло.

Независимо от того, что вынеобходимо сделать, как только у вас есть данные указанного положения, вы должны сделать это либо внутри блока completionHandler, либо внутри -setSpecifiedPosition:, либо в другом месте, которое уведомляется / запускается / вызывается одним из них.

...