2016-07-19 4 views
0

Обычно, когда вы пытаетесь захватить местоположение пользователя с помощью CLLocation, вы будете использовать метод didUpdateLocations, который (если все пойдет хорошо) будет вызываться при использовании locationManager.startUpdatingLocations().Swift: Как вручную вызвать CLLocation

Но мне нужно иметь возможность вручную вызывать функцию, которая получает местоположение, поэтому я могу использовать обработчик завершения с ним. Как я смогу получить местоположение пользователя после начала обновления местоположений без использования метода didUpdateLocations?

+0

Я не думаю, что я понимаю ваш вопрос. О каком обработчике завершения вы говорите? Вы должны использовать «locationManager: didUpdateLocations:», чтобы узнать, когда менеджер местоположений закончил обновление местоположения. – AdamPro13

ответ

0

Вы можете получить доступ к CLLocationManager 's location собственности в любое время. Это будет последнее место. Он может быть равен нулю, если местоположение не определено.

Если вы ориентируетесь на iOS 9 & позже, вы можете использовать метод requestLocation, чтобы запросить одно обновление местоположения. Обновление местоположения будет доставлено до didUpdateLocations, как обычно. Не существует синхронного/блокирующего «местоположения запроса, дожидаться его обновления и возврата мне на место».

1

Вы не можете «вручную вызвать CLLocation». После того, как вы начнете обновление местоположений, система начнет вызывать ваш метод didUpdateLocations. Первые местоположения, которые вы получаете, могут иметь довольно низкую точность. Чтобы получить хорошее место, вам действительно нужно проверить точность и подождать, пока вы не получите место, соответствующее вашим требованиям, прежде чем принимать его.

Я еще не использовал новый метод requestLocation, поэтому я не знаю, как он действует в отношении плохих результатов, которые вы получаете при первом запросе местоположений. В документах говорится: «Исправление местоположения получено на уровне точности, указанном желаемым свойством« Свойство », но, предположительно, startUpdatingLocations также соблюдает желаемую точность, и первые несколько показаний, которые вы получаете от него, имеют тенденцию быть довольно плохими, если GPS был выключен, когда вы позвонили startUpdatingLocations ,

В любом случае оба подхода вызываются didUpdateLocations с результатами/результатами.

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

Вы можете дать ему метод getLocation(completion:) и потребовать его завершения. Реализация могла бы либо начать обновление местоположения, либо вызвать requestLocation (если этот метод возвращает исходные позиции, которые в первый раз надежны). Это также сэкономит закрытие обработчика завершения в (необязательной) переменной экземпляра. В реализации MyLocationManager didDpdateLocations он будет проверять обработчик завершения и называть его, если он был найден, а затем вычеркнуть обработчик завершения.

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