iPhone - MKReverseGeocoder - как убедиться, что результат вернулся

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

Итак, у меня есть класс 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.

Пожалуйста, уточните как можно подробнее. Спасибо


person Idan    schedule 14.08.2010    source источник


Ответы (1)


  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.
person Seamus Campbell    schedule 15.08.2010
comment
Примерно так я и думал, но потом я начал думать о том, что написал в своем посте. 1. Видите ли, получение метки - это сетевой запрос, действительно ли я хочу ждать, пока я получу ее обратно, и не показывать аннотацию раньше? если позже я обновлю свойство title, отразится ли оно на mapView? 2. прямо сейчас я выделяю новый MKReverseGeocoder для каждой аннотации (внутри MapPoint), это правильный способ сделать это? или есть способ использовать тот же самый и просто изменить его координаты? - person Idan; 15.08.2010
comment
MKReverseGeocoder устарел в iOS5. Вместо этого вам следует использовать CLGeocoder, если вы начинаете разработку своего приложения прямо сейчас — в противном случае вам может понадобиться перенести его позже. - person Axel; 28.05.2012