为什么这个CLLocationCoordinate2D变量不可分配?

我有一个地理编码方法,我希望它返回它为我生成的CLLocationCoordinate2D。

- (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; } 

然而,line coordinate = location.coordinate会产生错误。 XCode表示coordinate是一个不可分配的变量。 有谁看到我做错了什么?

更新:

按照塞巴斯蒂安的建议,我得到了编译的代码,但是, coordinate没有正确设置。 如果你看看我在方法中放入的两个NSLog语句,第一个打印出我需要分配给coordinate的正确coordinate ,但是一旦if语句退出, coordinate就会回到设置为(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; } 

如果要分配给在块范围之外定义的变量,则必须使用__block关键字:

 __block CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(0,0); 

看看Apple的Block Programming Topics的Blocks and Variables部分

关于编译时未设置的变量:

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]会立即返回,并且当块运行时将设置myCoordinate

如果你这样做,请注意这可能会导致参考周期,因为块保留了self。