Подождите, пока MKReverseGeocoder предоставит адрес - PullRequest
0 голосов
/ 04 марта 2011

Есть ли способ подождать, пока геокодер вызовет 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 Ответ

4 голосов
/ 04 марта 2011

Я думаю, что вы поступаете неправильно, нет причин блокировать, вам нужно сделать так, чтобы этот метод возвращал 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; 

Тогда в реализации вы увидите что-то вроде этого

* 1009.*

В вызывающем классе все, что вам нужно установить, это свойство делегата 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
    }
}
...