设置MKReverseGeocoderDelegate?

时间:2010-12-14 12:24:57

标签: iphone objective-c cocoa-touch

我对设置MKReverseGeocoderDelegate感到有点困惑,我从Apples示例中注意到他们将MKReverseGeocoder分配给属性iVar,最后我决定在找到位置时分配MKReverseGeocoder并释放MKReverseGeocoders,因为它们要么报告成功还是失败,这看起来是否正确?

// ------------------------------------------------------------------- **
// DELEGATE: CLLocationManager
// ------------------------------------------------------------------- **

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

    MKReverseGeocoder *myGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:[newLocation coordinate]];
    [myGeocoder setDelegate:self];
    [myGeocoder start];
}

// ------------------------------------------------------------------- **
// DELEGATE: MKReverseGeocoderDelegate
// ------------------------------------------------------------------- **

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark {
    NSLog(@"%@", [placemark locality]);
    [geocoder release];
}

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {
    [geocoder release];
}
@end

2 个答案:

答案 0 :(得分:3)

你在内存管理方面很好。如果你通过Instruments中的泄漏工具运行它,它可能会抱怨你的locationManager:didUpdate方法可能存在泄漏,但是这是错误的,它只是看不到你释放对象的位置。 / p> 但是,我会做一些事情来减少对地理编码器的影响。我会看到你didUpdate所处的位置具有值得讨论的准确性。当核心位置首次出现时,您可能会在硬件真正启动并接收之前获得一些垃圾命中。然后准确性将缩小到真实位置(谷歌地图应用程序非常清楚地显示了那里发生的事情,蓝色圆圈在你的真实位置归零)。在您获得100米左右的精确度之前,地理编码可能没有任何意义。

编辑:试试这个

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

  if((newLocation.coordinate.latitude != oldLocation.coordinate.latitude) && 
     (newLocation.coordinate.longitude != oldLocation.coordinate.longitude) &&
     ([newLocation horizontalAccuracy] < 100 && [newLocation horizontalAccuracy] > 0))
    {

        MKReverseGeocoder *myGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:[newLocation coordinate]];
        [myGeocoder setDelegate:self];
        [myGeocoder start];
    }
}

这应该忽略与上次更新相同的更新(可能相当频繁)和那些具有无效准确性的更新(当位置硬件首次启动时偶尔会出现负数)或结束时100米的水平精度。

此外,如果您只想这样做一次,请在获得有效且足够准确的位置后继续让CLLocationManager停止更新。

答案 1 :(得分:1)

MKReverseGeocoder Class Reference中,Apple说

  

每个Map Kit应用程序都具有有限的反向地理编码容量,因此谨慎使用反向地理编码请求对您有利。以下是最有效使用此类的一些经验法则:

     
      
  • 为任何一个用户操作发送最多一个反向地理编码请求。
  •   
     

(...)

在您的情况下,如果网络连接速度较慢(即位置更改比位置查找更快),则可以实例化多个请求。

在大多数情况下,您的代码可能会正常工作,但不是建议的实现方式。实施任何只能“在大多数情况下”工作的东西根本不是一个好主意。