2016-11-17 3 views
0

Ниже приведены некоторые фрагменты моего кодаCLLocationManager stopUpdatingLocation не останавливает

BOOL checkingForLocation; 
. 
. 
. 
- (IBAction)LocationButtonTapped:(id)sender { 
    [locationManager startUpdatingLocation]; 
    checkingForLocation = YES; 
} 
. 
. 
. 
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { 

    [locationManager stopUpdatingLocation]; 
    // locationManager = nil; 


    if (checkingForLocation) { 
     checkingForLocation = NO; 
     NSLog(@"here"); 
     // fetch data from server using location and present view controllers 
    } 
} 

didUpdateLocations вызывается несколько раз, потому что locationManager постоянно обновляет местоположение каждого startUpdatingLocation. У моего приложения есть ошибка, где код в пределах if(checkingForLocation) работает несколько раз и отображает представление несколько раз, вызывая нежелательные результаты.

1) Почему это останавливаетUpdatingLocation не останавливает дальнейшие вызовы didUpdateLocations?

2) Кроме того, если checkingForLocation уже установлен NO почему последующие вызовы didUpdateLocations все еще относятся к checkingForLocation как YES. Там есть соревнование?

С помощью поиска других вопросов SO я обнаружил, что настройка locationManager = nil остановит дополнительные вызовы на didUpdateLocations, которые он исправляет проблему в моем случае, но никаких реальных объяснений. Кажется, что stopUpdatingLocation должен позаботиться об этом. Любое понимание очень ценится.

Спасибо,

+0

Где вы называете '[locationManager startUpdatingLocation]; checkForLocation = YES; '? – OgreSwamp

+0

@OgreSwamp Я вызываю его при нажатии кнопки. Для ясности я добавил метод IBAction. – galenom

ответ

0

didUpdateLocations: можно назвать часто и в любое время из-за своей асинхронной природы и optimisations:

Потому что это может занять несколько секунд, чтобы вернуться в начальное положение, менеджер место как правило, доставляет предварительно кэшированное местоположение данных, а затем доставляет более современные данные о местоположении, так как он становится доступен . Поэтому всегда рекомендуется проверять метку времени любого объекта местоположения, прежде чем предпринимать какие-либо действия. Если одновременно включены службы определения местоположения , они доставляют события , используя тот же набор методов делегата.

На самом деле, если вы раскомментировать locationManager = nil; это должно помочь, но если вы хотите использовать checkingForLocation собственность, вы должны сделать назначение синхронизированный. @synchronized(self) - самый простой способ в этом случае.