我正在尝试使用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;
}
提前感谢您的帮助!
答案 0 :(得分:0)
我对这个特定的API并不熟悉,但事实上它采用了一个名为completionHandler
的块非常强烈地表明这是一个异步操作。也就是说,您的块将在以后中调用(来自运行循环)。源代码中的第二个NSLog
在调用completionHandler
之前发生,因此它当然没有看到分配,因为它还没有发生。
一旦你拥有了givenPosition数据,你需要做什么,你应该在completionHandler
块内,-setSpecifiedPosition:
内部,或者由一个通知/触发/调用的其他地方执行此操作那些。