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

时间:2012-12-17 07:00:20

标签: objective-c ios cllocationmanager reverse-geocoding

我试图简单地返回用户的状态。我知道我需要使用reverseGeocodeLocation。我希望将状态作为NSString返回,就像我返回下面的用户纬度一样:

- (NSString *)getUserLatitude
{
NSString *userLatitude = [NSString stringWithFormat:@"%f", 
locationManager.location.coordinate.latitude];
return userLatitude;
}

我目前有这个代码,但我无法让它工作。可能是因为我正在使用(无效)。我有点迷失了。

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

    }
}];
}

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

2 个答案:

答案 0 :(得分:0)

您必须在完成块中对检索到的位置执行某些操作。这个代码在方法(带有void返回)返回后很久就异步执行。

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

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

取而代之的是:

[myViewController didFinishGettingState:userState];

你应该研究块和GCD的基础知识,这样你就可以理解这种异步技术是如何工作的。

答案 1 :(得分:0)

您可能不了解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函数。它只是应该做某事,这可能是调用示例中定义的“委托”方法。