2010-12-14 4 views
0

MKReverseGeocoderDelegate 설정에 대해 다소 혼란 스럽습니다. Apple 예제에서 MKReverseGeocoder를 속성 iVar에 할당한다는 것을 알았습니다. 결국에는 위치가 발견되면 MKReverseGeocoder를 할당하고 MKReverseGeocoders를 해제하기로 결정했습니다. 성공 또는 실패를 다시보고하십시오. MKReverseGeocoder Class Reference에서MKReverseGeocoderDelegate 설정하기?

// ------------------------------------------------------------------- ** 
// 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 

답변

3

메모리 관리 측면에서는 문제가 없습니다. 인스트루먼트의 누수 도구를 통해이 도구를 실행하면 locationManager:didUpdate 메서드에서 누출 가능성에 대해 불평 할 것입니다.하지만 그 점에 대해서는 잘못되었습니다. 개체를 놓을 위치를 알 수 없습니다.

지오 코더에 미치는 영향을 줄이기 위해 몇 가지 작업을 수행합니다. 나는 당신이 단지 didUpdate 위치에 대해 말할 가치가있는 정확성을 가지고있는 것을보고 보았습니다. 핵심 위치가 처음 생기면 하드웨어가 실제로 작동하기 전에 쓰레기가 나올 가능성이 큽니다. 그리고 실제 위치에서 정확도가 좁아집니다 (Google지도 앱은 실제 상황을 아주 잘 보여줍니다. 실제 위치에서 파란색 원이 표시됩니다). 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의 업데이트를 중지하십시오.

+0

에 대해 생각하게 만들었습니다. GeoCoder에 미치는 영향을 줄이기 위해 설계된 코드가 있습니다. 아직 Xcode에서 구현하지 않았습니다. 난 그냥 올바른 트랙 메모리 관리에 있는지 확인하고 싶었어. – fuzzygoat

1

애플은

각지도 키트 응용 프로그램이 역 지오 코딩 능력의 제한된 양을 가지고 있다고, 그래서 드물게 역 지오 코딩 요청을 사용하는 당신의 이점에있다. 이 클래스를 가장 효과적으로 사용하기위한 몇 가지 경험 법칙을 다음과 같습니다.

  • 하나의 사용자 동작에 대해 하나 이상의 역 지오 코딩 요청을 보냅니다.

(...) 귀하의 경우에는

, (즉, 위치 변경이 빠른 위치 조회 후된다), 다수의 요청을 인스턴스화 할 수있는 느린 네트워크 연결이있는 경우.

대부분의 경우 코드가 정상적으로 작동하지만 제안 된 방법은 아닙니다. 그리고 "대부분의 경우"에만 작동하는 것을 구현하는 것은 전혀 goot 아이디어가 아닙니다.

+0

위의 코드는이를 반영하지 않지만 응용 프로그램은 단순히 타이머 (예 : 5 분마다)에 위치를 묻습니다. 위치가 발견되면 위치 관리자 (및 모든 지오 코더 요청)가 다음에 타이머가 활성화됩니다. 또한 약 4-5 개의 CLLocation 객체를 수신 중이므로 가장 정확한 지오 코드를 찾습니다. 그래서 내 타이머는 "사용자 동작"이고 "지오 코드"요청은 타이머 실행과 연결된 단일 동작이라고 생각합니다. – fuzzygoat

+0

이 경우에는 코드가 문제가 없다고 생각합니다. –

+0

bjorn, 그 확실한 요점은 내 디자인 (+1) – fuzzygoat