2010-11-16 6 views
0

У меня были проблемы с обратными вызовами CLLocationManager
Каков наилучший способ ожидания асинхронного обратного вызова?Ожидание асинхронного обратного вызова - Objective-C

Вот что я в принципе хочу сделать:

 

- (NSString *)getCurrentCity 
{ 
     [self.locationManager startUpdatingLocation]; 
     // Wait for coordonate in callbacks 
     self.geocoder = [MKReverseGeocoder alloc] initWithCoordonate:self.newCoordonate]; 
     [self.geocoder start]; 
     // Wait for information with MKReverse callbacks 
     return self.currentCity; 
} 
// Callbacks methods of MKReverseGeocoder and CLLocationManager 
- (void)locationManager:(CLLocationManager *)manager 
    idUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
     CLLocationCoordinate2D newCoordonate = newLocation.coordinate; 
     self.currentCoordonate = &newCoordonate; 
} 

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder 
     didFindPlacemark:(MKPlacemark *)placemark 
{ 
     self.currentCity = placemark.locality; 
} 

Где self.currentCity и self.newCoordonate является attribut в моем Классе.

Я пробовал некоторые трюки, такие как Thread и/или синхронизированный, но мне не удалось его вернуть, прежде чем все закончится.

С наилучшими пожеланиями

+0

self.currentCoordonate = & newCoordonate; Это пугает меня на нескольких уровнях. –

+0

Весь смысл асинхронного обратного вызова заключается в том, что вам не нужно его ждать. – koo

ответ

2

Вам не ждать его завершения, вы регулируете обновление, когда асинхронный locationmanager:didUpdatefromLocation: называется. Это точка асинхронного программирования. :)

+0

Согласен; на самом деле . Я просто хочу вызвать метод, чтобы получить одну информацию, передав асинхронные обратные вызовы. И если бы я мог пройти его синхронизацию, я был бы хорош для меня. Думаю, что – klefevre

+0

. Можно написать класс оболочки «GPSManager» или что-то в этом роде. Он будет обрабатывать вещи CLLocationManager и раскрывать два свойства, такие как 'positionAvailable' и' currentPosition' для использования в вашем другом коде. –

+0

Ive уже пробовал это, но это то же самое ... Как узнать, изменилась ли моя собственность? Он работает также асинхронно. – klefevre

1

Каждый раз, когда вы блокируете основной поток, ваше приложение перестает отвечать (в лучшем случае) и будет сброшено системой (т. Е. Убито - в худшем случае).

Для асинхронных интерфейсов, самый простой шаблон, чтобы изолировать все на резьбе или очередями или любой другой механизм, который вы используете, чтобы получить работу от главной нити в классе, который заботится о стыковки обратно в основной поток по мере необходимости ,

Для примера см. NSFileHandle. Он имеет метод readInBackgroundAndNotify:. Когда используется, экземпляр NSFileHandle внутренне создает поток, использует этот поток, чтобы читать все, что необходимо, затем использует что-то вроде performSelectorOnThread: для отправки уведомления в поток - обычно основной поток - который называется readInBackgroundAndNotify:.

Таким образом, пользователям класса не нужно иметь дело с резьбой , но класс не блокирует цикл основного события.


КСТАТИ:

{ 
    CLLocationCoordinate2D newCoordinate = newLocation.coordinate; 
    self.currentCoordonate = &newCoordinate; 
} 

Это совершенно неправильно и верный способ гарантировать аварии или неопределенное поведение. &newCoordinate дает адрес newCoordinate, но эта структура находится в стеке. Как только этот метод вернется, содержимое указанной структуры будет уничтожено.

+0

Я делаю это, потому что объявляю указатель CLLocationCoordinate2D. Итак, CLLocationCoordinate2D * newCoordinate = & newCoordinate; отлично работает – klefevre

+1

@ KL94: Да, это указатель, и, конечно, ваш код принят системой типа Objective-C. Для рабочей программы больше, чем для соответствия вашим типам.Взятие указателя на автоматическую переменную и сохранение ее в переменной экземпляра - это неопределенное поведение - это ошибка или произойдет сбой. Вопросы, чтобы попросить себя найти правильное решение: * Почему * эта переменная экземпляра указатель? Если есть причина, это должно быть, в чем причина? Вам нужно правильно разработать свой код вокруг этого ограничения. В противном случае не делайте это указателем. – Chuck

Смежные вопросы