实例变量不保留值

时间:2012-02-26 23:25:09

标签: ios5 clgeocoder

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

我在.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 :(得分:0)

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

一旦你拥有了givenPosition数据,你需要做什么,你应该在completionHandler块内,-setSpecifiedPosition:内部,或者由一个通知/触发/调用的其他地方执行此操作那些。