我有一个如下所示的方法:
-(NSString *)getCityFromLocation:(CLLocation *)location {
__block NSString *city;
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder reverseGeocodeLocation: location completionHandler:
^(NSArray *placemarks, NSError *error) {
//Get address
CLPlacemark *placemark = [placemarks objectAtIndex:0];
city = [placemark.addressDictionary objectForKey:@"City"];
NSLog(@"city 1: %@", city);
}];
return city;
}
我这样调用它:
NSString *city = [self getCityFromLocation:currentLocation];
NSLog(@"city 2: %@", city);
在 NSLog 中,我得到:
city 2: (null)
city 1: London
问题很明显 - 它在运行该 block 之前就返回了。我怎样才能让它按预期工作,它可以返回 block 产生的值?
最佳答案
最初,您已将完成 block 分配给reverseGeocodeLocation
。但当时它并没有打电话。当反向地理编码过程完成
时它将调用。但是city
立即返回。这就是为什么你会变成这样。
您可以通过将其分配给本地属性来解决。当完成 block 被执行时。所以代码应该是。
[geocoder reverseGeocodeLocation: location completionHandler:
^(NSArray *placemarks, NSError *error) {
//Get address
CLPlacemark *placemark = [placemarks objectAtIndex:0];
self.city = [placemark.addressDictionary objectForKey:@"City"];
}];
关于iphone - 返回从 block 内部设置的 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16166316/