【问题标题】:Instance Variable Not Retaining Value实例变量不保留值
【发布时间】:2012-02-26 23:25:08
【问题描述】:

我正在尝试使用 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;
}

提前感谢您的帮助!

【问题讨论】:

    标签: ios5 clgeocoder


    【解决方案1】:

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

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

    【讨论】:

    • 我认为这是正确的 - 查看时间戳会发现它们出现故障。谢谢!!!
    • @AlexSBerman 很高兴我能帮上忙。如果事实证明可以解决您的问题,请单击复选标记以接受此答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2021-11-17
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    相关资源
    最近更新 更多