Подождите, пока MKReverseGeocoder предоставит адрес
Есть ли способ ждать, пока геокодер вызовет didFailWithError или didFindPlaceMark?
Моя проблема заключается в том, что мне нужно вызвать метод, который получает координаты и возвращает метку, содержащую адрес. Но когда я звоню [myGeocoder start], код продолжается, и я получаю пустую метку.
Мой код:
- (MKPlasemark*) getAddress:(CLLocationCoordinate2D) coordinate
{
[self startGeocoder:coordinate];
return self.foundPlasemark;
}
- (void)reverseGeocoder:(MKReverseGeocoder*)geocoder didFindPlacemark:(MKPlaseMark*)plasemark
{
self.foundPlasemark=plasemark;
}
- (void)reverseGeocoder:(MKReverseGeocoder*)geocoder didFailWithError:(NSError*)error
{
self.foundPlasemark=nil;
}
Я попытался выполнить sleep(), вызвав один из следующих методов, но он не сработал.
1 ответ
Я думаю, что вы делаете это неправильно, нет причин блокировать, вам нужно сделать так, чтобы этот метод возвращал void, а в классе, который обрабатывает геокодирование, определите протокол, который имеет метод say -(void)didReceivePlacemark:(id) метка, метка может быть нулевой или какой-либо меткой, и она вызывается, когда возвращается геокодер. Вы также делаете свойство делегата для своего класса, чтобы любой мог подписаться на протокол... Затем в вызывающем классе подписаться на протокол и реализовать метод... Вот еще немного о протоколах
Надеюсь, это поможет. Вот пример: так интерфейс вашего класса, который выполняет геокодирование, будет выглядеть примерно так
@protocol GeocoderControllerDelegate
-(void)didFindGeoTag:(id)sender; // this is the call back method
@end
@interface GeocoderController : NSObject {
id delegate;
}
@property(assign) id <GeocoderControllerDelegate> delegate;
Тогда в реализации вы увидите что-то вроде этого
- (void) getAddress:(CLLocationCoordinate2D) coordinate
{
[self startGeocoder:coordinate];
}
- (void)reverseGeocoder:(MKReverseGeocoder*)geocoder didFindPlacemark:(MKPlaseMark*)plasemark
{
[delegate didFindGeoTag:plasemark];
}
- (void)reverseGeocoder:(MKReverseGeocoder*)geocoder didFailWithError:(NSError*)error
{
[delegate didFindGeoTag:nil]
}
В вызывающем классе все, что вам нужно установить, это свойство делегата GeocoderClass, и реализовать протокол, реализация может выглядеть примерно так
-(void)findMethod
{
GeocoderController *c=...
[c setDelegate:self];
[c findAddress];
//at this point u stop doing anything and just wait for the call back to occur
//this is much preferable than blocking
}
-(void)didFindGeoTag:(id)sender
{
if(sender)
{
//do something with placemark
}
else
{
//geocoding failed
}
}