CLGeocoder reverseGeocodeLocation。第一次在[placemarks count = 0]?

时间:2012-07-02 04:18:12

标签: objective-c ios geolocation mkmapview clgeocoder

我是ObjC的新手,我正在与CLGeocoder斗争。我希望能够使用reverseGeocodeLocation获取一个字符串,其中包含我在用户按下“完成”按钮时传递给我的委托的用户位置。

所以用户触发了MapViewController的显示,我第一次调用了viewDidLoad中的reverseGeocodeLocation,但是[placemarks count = 0],我没有地标来获取我需要的信息。第二次用户触发MapViewController的显示时,地标数组已经填充并且一切正常。

我怀疑它与reverseGeocodeLocation是异步调用有关 - 但我无法弄清楚如何解决这个问题。我试过在线搜索,但似乎没有什么能帮助我理解我做错了什么以及如何解决这个问题。提前谢谢。

@interface MapViewController ()
@property (strong, nonatomic) CLGeocoder *geocoder;
@property (readwrite, nonatomic) NSString *theLocationName;
@end

@implementation MapViewController
@synthesize mapView, geocoder, delegate = _delegate, theLocationName = _theLocationName;

- (void)viewDidLoad
{
[super viewDidLoad];

self.mapView.delegate=self;
self.mapView.showsUserLocation = YES;

[self theUserLocation];
}

-(void)theUserLocation
{
if (!geocoder)
{
    geocoder = [[CLGeocoder alloc] init];
}

MKUserLocation *theLocation;
theLocation = [self.mapView userLocation];

[geocoder reverseGeocodeLocation:theLocation.location 
               completionHandler:^(NSArray* placemarks, NSError* error)
 {
     if ([placemarks count] > 0)
     {
         CLPlacemark *placemark = [placemarks objectAtIndex:0];

         [self setTheLocationName: placemark.locality];

     }
 }];

- (IBAction)done:(id)sender 
{

[[self delegate] mapViewControllerDidFinish:self locationName:[self theLocationName]];

}

@end

2 个答案:

答案 0 :(得分:3)

这不是你的问题的确切答案,但是,如果你可以切换到CLGeocoder以外的其他解决方案而不是以下功能可以帮助你从给定的纬度,经度获取地址

#define kGeoCodingString @"http://maps.google.com/maps/geo?q=%f,%f&output=csv" //define this at top

-(NSString *)getAddressFromLatLon:(double)pdblLatitude withLongitude:(double)pdblLongitude
{
    NSString *urlString = [NSString stringWithFormat:kGeoCodingString,pdblLatitude, pdblLongitude];
    NSError* error;
    NSString *locationString = [NSString stringWithContentsOfURL:[NSURL URLWithString:urlString] encoding:NSASCIIStringEncoding error:&error];
    locationString = [locationString stringByReplacingOccurrencesOfString:@"\"" withString:@""];
    return [locationString substringFromIndex:6];
}

信用:Selected Answer to this question

答案 1 :(得分:2)

  

因此用户触发了MapViewController的显示,我在viewDidLoad中调用了reverseGeocodeLocation,但是第一次调用了[placemarks count = 0],而且我没有地标来获取我需要的信息。第二次用户触发MapViewController的显示时,地标数组已经填充,一切正常。

这不是因为呼叫是异步的 - 这是因为第一次调用theUserLocation时实际位置不可用。获取用户的位置不是即时的 - 需要时间。但是,一旦地图加载,您就会要求用户的位置,这在大多数情况下都无效。

您需要做的是挂钩MKMapViewDelegate方法,这些方法会在更新位置时为您提供回调。您可以使用它来检查位置的准确性,并确定它是否足以让您反转地理定位。