0

我正在尝试使用 CLGeocoder 对象转发 iOS 5 中的地址,并将生成的 CLLocation 放入实例变量中。出于某种原因,我可以设置实例变量,然后调用它的 getter,但该变量会在地理编码器的完成处理程序范围之外丢失其值。

我在 .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;
}

在此先感谢您的帮助!

4

1 回答 1

0

我不熟悉这个特定的 API,但它使用了一个completionHandler非常强烈地调用的块这一事实表明这是一个异步操作。也就是说,稍后将调用您的块(从运行循环中)。您NSLog在源代码中的第二个是在调用之前发生的completionHandler,所以它当然看不到分配,因为它还没有发生。

拥有指定位置数据后,无论您需要做什么,都应该在completionHandler块内部、内部-setSpecifiedPosition:或由其中之一通知/触发/调用的其他地方进行。

于 2012-02-26T23:40:09.137 回答