0

我试图简单地返回用户的状态。我知道我需要使用 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;

    }
}];
}

有人有想法么?谢谢!

4

2 回答 2

0

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

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

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

取而代之的是:

[myViewController didFinishGettingState:userState];

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

于 2012-12-17T07:11:21.157 回答
0

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

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

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

于 2012-12-17T08:32:44.827 回答