Ios 为什么这个CLLocationCoordinate2D变量是不可分配的?
我有一个geocoder方法,我希望它返回它为我生成的CLLocationCoordinate2DIos 为什么这个CLLocationCoordinate2D变量是不可分配的?,ios,objective-c,objective-c-blocks,Ios,Objective C,Objective C Blocks,我有一个geocoder方法,我希望它返回它为我生成的CLLocationCoordinate2D - (CLLocationCoordinate2D)geocode{ CLGeocoder *geocoder = [[CLGeocoder alloc] init]; CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0); [geocoder geocodeAddressDictionar
- (CLLocationCoordinate2D)geocode{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0);
[geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
if([placemarks count]) {
CLPlacemark *placemark = [placemarks objectAtIndex:0];
CLLocation *location = placemark.location;
coordinate = location.coordinate;
} else {
NSLog(@"error");
}
}];
return coordinate;
}
行coordinate=location.coordinate
会产生错误。XCode表示坐标是一个不可分配的变量。有人知道我做错了什么吗
更新:
在遵循sebastian的建议后,我得到了要编译的代码,但是,坐标设置不正确。如果您查看我在方法中输入的两个NSLog语句,第一个语句将打印出我需要分配给坐标
的正确坐标,但是一旦If语句退出,坐标
将返回到设置为(0,0)。第二条NSLog语句打印(0,0)。有人知道我怎么解决这个问题吗
- (CLLocationCoordinate2D)geocode{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
__block CLLocationCoordinate2D geocodedCoordinate = CLLocationCoordinate2DMake(0,0);
[geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
if([placemarks count]) {
CLPlacemark *placemark = [placemarks objectAtIndex:0];
CLLocation *location = placemark.location;
geocodedCoordinate = location.coordinate;
NSLog(@"%f, %f", coordinate.longitude, coordinate.latitude);
} else {
NSLog(@"error");
}
}];
NSLog(@"%f, %f", coordinate.longitude, coordinate.latitude);
return coordinate;
}
如果要分配给在块范围外定义的变量,必须使用\u块
关键字:
__block CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0);
看一看
关于编译时未设置的变量:
geocodeAddressDictionary:completionHandler:
异步运行。这意味着它会立即返回,但当结果可用时,块会在稍后执行。您需要更改调用方法的方式。目前,你可能正在做类似的事情
self.myCoordinate = [self geocode];
你需要做的是:
- (void)geocode{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressDictionary:self.placeDictionary completionHandler:^(NSArray *placemarks, NSError *error) {
if([placemarks count]) {
CLPlacemark *placemark = [placemarks objectAtIndex:0];
CLLocation *location = placemark.location;
self.myCoordinate = location.coordinate;
NSLog(@"%f, %f", coordinate.longitude, coordinate.latitude);
} else {
NSLog(@"error");
}
}];
}
运行[self geocode]
会立即返回,块运行时将设置mycoordinal
如果这样做,请注意这可能导致一个参考循环,因为self被块保留。“如果这样做,请注意这可能导致一个参考循环”不,它不会。“因为自我被封锁了。”那么<代码>自我
不保留该块