iphone - 返回从 block 内部设置的 NSString

标签 iphone ios objective-c block cllocation

我有一个如下所示的方法:

-(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/

相关文章:

iphone - 如何检查用户是否在 CGPath 附近点击?

iPhone 在导航 Controller 动画期间崩溃,我有什么选择?

ios - 获取 UITesting Xcode 7 中表格每个部分的行数

iphone - 为什么 performSelector : crash my application?

ios - 复制 iOS 邮件应用程序的撰写功能的样式

javascript - 无法可靠地检测 iPhone 纵向和横向模式之间的滚动底部

iphone - 将多对多关系迁移到 Core Data 中的连接表

ios - Xcode - 如何将程序员的名字更改为公司?

ios - 使用 Xcode 13.3 构建时,格式化程序损坏的 SwiftUI TextField?

IOS - 导入提要图像 - Retina 支持