IPhone - MKReverseGeocoder - как убедиться, что у меня есть результат - PullRequest
0 голосов
/ 14 августа 2010

что я пытаюсь достичь, это отобразить аннотацию с названием города.

Итак, у меня есть класс MapPoint:

@interface MapPoint : NSObject<MKAnnotation,MKReverseGeocoderDelegate> {

    NSString* title;
    NSString* cityName;
    CLLocationCoordinate2D coordinate;
    MKReverseGeocoder* reverseGeo;
}

@property (nonatomic,readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic,copy) NSString* title;
@property (nonatomic,copy) NSString* cityName;

-(id) initWithCoordinate:(CLLocationCoordinate2D)c tilte:(NSString*)t;

@end

Я реализовал это так:

@implementation MapPoint

@synthesize title,coordinate,cityName;

-(id) initWithCoordinate:(CLLocationCoordinate2D)c tilte:(NSString*)t
{
    [super init];
    coordinate = c;
    reverseGeo = [[MKReverseGeocoder alloc] initWithCoordinate:c];
    reverseGeo.delegate = self;
    [reverseGeo start];
    [self setTitle:t];
    return self;

}

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark
{
    NSString* city = [placemark.addressDictionary objectForKey:(NSString*)kABPersonAddressCityKey];
    NSString* newString = [NSString stringWithFormat:@"city-> %@",city];
    [self setTitle:[title stringByAppendingString:newString]];
}

-(void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error{
    NSLog(@"error fetching the placemark");
}

-(void)dealloc
{
    [reverseGeo release];
    [cityName release];
    [title release];
    [super dealloc];
}

@end

Затем в моем делегате CoreLocation я использую MapPoint следующим образом:

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
  MapPoint* mp = [[MapPoint alloc] initWithCoordinate:[newLocation coordinate] tilte:[locationTitleField text]];
    [mapView addAnnotation:mp];

    [mp release];

}

Теперь у меня есть 2 проблемы, в которых я не уверен:

  1. Правильно ли использовать reverseGeo в качестве элемента данных, или лучшим вариантом будет просто выделить его внутри инициализатора и освободить его внутри делегатов didFindPlacemark / didFailWithError (возможно ли вообще его там освободить)?

  2. Как я могу быть уверен, что когда мои аннотации отобразятся, я точно знаю, что reverseGeo вернулся с ответом (меткой или ошибкой - что бы это ни было). Возможно, просто неправильно ждать ответа сети, и я должен оставить это так - я просто не уверен, когда / когда придет ответ сети, он соответствующим образом обновит AnnotationView в MapView.

Пожалуйста, опишите как можно больше. Спасибо

1 Ответ

0 голосов
/ 15 августа 2010
  1. Можно хранить его как элемент данных.

  2. Похоже, вы оставляете след аннотаций для текущего местоположения пользователя?Если вы дополняете обычную аннотацию текущего местоположения пользователя «следом крошки хлеба», показывающим, где был пользователь, тогда вам нужно подождать, чтобы добавить точку на карту, пока вы не получите аннотацию обратно (если это поведениеты хочешь).Я бы сделал это, сделав класс, управляющий вашей картой, делегатом MKReverseGeocoder (и установив для него свойство title, а затем добавив аннотацию к карте в reverseGeocoder:didFindPlacemark), или добавив ссылку на карту в ваш класс MapPoint, и он будетдобавить себя на карту в том же обратном вызове.

Кстати, документация для MKReverseGeocoder включает в себя следующий текст:

  • When you want to update the location automatically (such as when the user is moving), reissue the reverse-geocoding request only when the user's location has moved a significant distance and after a reasonable amount of time has passed. For example, in a typical situation, you should not send more than one reverse-geocode request per minute.
...