что я пытаюсь достичь, это отобразить аннотацию с названием города.
Итак, у меня есть класс 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 проблемы, в которых я не уверен:
Правильно ли использовать reverseGeo в качестве элемента данных, или лучшим вариантом будет просто
выделить его внутри инициализатора и освободить его внутри делегатов didFindPlacemark / didFailWithError (возможно ли вообще его там освободить)?
Как я могу быть уверен, что когда мои аннотации отобразятся, я точно знаю, что reverseGeo вернулся с ответом (меткой или ошибкой - что бы это ни было).
Возможно, просто неправильно ждать ответа сети, и я должен оставить это так - я просто не уверен, когда / когда придет ответ сети, он соответствующим образом обновит AnnotationView в MapView.
Пожалуйста, опишите как можно больше.
Спасибо