使用 reverseGeocodeLocation 将用户的状态作为 NSString 返回

Posted

技术标签:

【中文标题】使用 reverseGeocodeLocation 将用户的状态作为 NSString 返回【英文标题】:Return User's State as an NSString with reverseGeocodeLocation 【发布时间】:2012-12-17 07:00:19 【问题描述】:

我试图简单地返回用户的状态。我知道我需要使用 reverseGeocodeLocation。我想以与返回以下用户纬度相同的方式将状态作为 NSString 返回:

- (NSString *)getUserLatitude

NSString *userLatitude = [NSString stringWithFormat:@"%f", 
locationManager.location.coordinate.latitude];
return userLatitude;

我目前有这个代码,但我无法让它工作。可能是因为我使用的是(void)。我只是有点失落。

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation 
*)newLocation fromLocation:(CLLocation *)oldLocation 

CLGeocoder * geoCoder = [[CLGeocoder alloc] init];
[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, 
NSError *error) 
    for (CLPlacemark * placemark in placemarks) 
        NSString *userState = [placemark locality];

    return userState;

    
];

有人有什么想法吗?谢谢!

【问题讨论】:

【参考方案1】:

您必须对完成块中检索到的位置做一些事情。此代码在方法(返回 void)返回自身后很长时间才异步执行。

通常你会在你自己的视图控制器或模型类上调用某种方法来传递检索到的信息。

替换return userState,它与块的返回类型不匹配。

改为:

[myViewController didFinishGettingState:userState];

您应该研究块和 GCD 基础知识,以便了解这种异步性是如何工作的。

【讨论】:

【参考方案2】:

您可能不了解您的 completionHandler 的工作方式。 reverseGeocodeLocation:completionHandler: 带有一个处理程序,该处理程序将在查找完成时执行,并以placemarkserror 作为参数调用。

你要做的就是在那个区块中执行一些有意义的事情。 我会开始检查是否发生任何错误,然后我会调用一个失败或成功的方法,如下所示

[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *placemarks, NSError *error) 
    if (error != nil) 
        // Something bad happened...
        [self didFailRetrievingUserState:error];
     else 
        // Check whether the placemark retrieved is unique
        if (placemarks.count > 1) 
           NSMutableArray * states = [NSMutableArray array];
           for (CLPlacemark * placemark in placemarks) 
               NSString * userState = [placemark locality];
               [states addObject:userState];
           
           [self didFinishRetrievingUserStates:states];
         else 
           [self didFinishRetrievingUserState:[placemarks[0] locality]];
        
    
];

那么你当然需要实现我们在上面的块中调用的三个方法

- (void)didFailRetrievingUserState:(NSError *)error 
  // Show error


- (void)didFinishRetrievingUserStates:(NSArray *)userStates 
  // Do something reasonable with the multiple possible values 


- (void)didFinishRetrievingUserState:(NSString *)userState 
  // Do something reasonable with the only result you have

显然,上面的代码是一个建议。您可以做出不同的决定,例如处理处理程序块内的所有逻辑,或者不区分唯一/非唯一情况。

一般来说,重要的是您要了解处理程序块不应该返回任何内容,因为它是一个void 函数。它只是应该做某事,而这可能会调用示例中定义的“委托”方法。

【讨论】:

以上是关于使用 reverseGeocodeLocation 将用户的状态作为 NSString 返回的主要内容,如果未能解决你的问题,请参考以下文章

reverseGeocodeLocation 存储为 NSString 产生错误

在 iOS 中强制使用 reverseGeocodeLocation 的语言环境

从 reverseGeocodeLocation 仅返回英文地址

Swift 中的 CLGeocoder - 使用 reverseGeocodeLocation 时无法返回字符串

使用 reverseGeocodeLocation: 设置地址字符串并从方法返回

如何本地化来自 reverseGeocodeLocation 的地址结果?