Вы не можете «вручную вызвать CLLocation». После того, как вы начнете обновление местоположений, система начнет вызывать ваш метод didUpdateLocations
. Первые местоположения, которые вы получаете, могут иметь довольно низкую точность. Чтобы получить хорошее место, вам действительно нужно проверить точность и подождать, пока вы не получите место, соответствующее вашим требованиям, прежде чем принимать его.
Я еще не использовал новый метод requestLocation
, поэтому я не знаю, как он действует в отношении плохих результатов, которые вы получаете при первом запросе местоположений. В документах говорится: «Исправление местоположения получено на уровне точности, указанном желаемым свойством« Свойство », но, предположительно, startUpdatingLocations
также соблюдает желаемую точность, и первые несколько показаний, которые вы получаете от него, имеют тенденцию быть довольно плохими, если GPS был выключен, когда вы позвонили startUpdatingLocations
,
В любом случае оба подхода вызываются didUpdateLocations
с результатами/результатами.
Если вы хотите вызвать обработчик закрытия/завершения после получения местоположения, я предлагаю вам создать свой собственный менеджер местоположений singleton. Назовем это MyLocationManager
.
Вы можете дать ему метод getLocation(completion:)
и потребовать его завершения. Реализация могла бы либо начать обновление местоположения, либо вызвать requestLocation
(если этот метод возвращает исходные позиции, которые в первый раз надежны). Это также сэкономит закрытие обработчика завершения в (необязательной) переменной экземпляра. В реализации MyLocationManager didDpdateLocations он будет проверять обработчик завершения и называть его, если он был найден, а затем вычеркнуть обработчик завершения.
Я не думаю, что я понимаю ваш вопрос. О каком обработчике завершения вы говорите? Вы должны использовать «locationManager: didUpdateLocations:», чтобы узнать, когда менеджер местоположений закончил обновление местоположения. – AdamPro13