Получение обновления местоположения iPhone без завершения текущего потока кода

#ios #multithreading #location

#iOS #многопоточность #Расположение

Вопрос:

Я новичок в программировании на iOS, и у меня есть основной вопрос. До сих пор я получал местоположение своего iPhone, включив обновления местоположения в моем объекте LocationManager. После этого мой код заканчивается, и я получаю местоположение при вызове метода делегирования didUpdateLocations.

Но теперь я хотел бы получить одно обновление местоположения и сделать это из последовательности кода, подобной этой:

Строка 1: что угодно

Строка 2: что угодно

Строка 3: что угодно

Строка 4: [LocationManager requestLocation]

Строка 5: дождитесь обновления местоположения

Строка 6: используйте новую информацию о местоположении

Строка 7: что угодно

и т.д.

Но я понимаю, что didUpdateLocations не будет вызываться, пока поток выше находится в «Ожидании обновления местоположения».

Каков правильный способ справиться с такой ситуацией?

Нужно ли мне каким-то образом запрашивать, чтобы обновление местоположения выполнялось в другом потоке, чтобы мой поток выше мог продолжать работать параллельно?

Спасибо,

-Стив

Новые изменения:

Допустим, я делаю это внутри didUpdateLocations: установите флаг для глобальной переменной, чтобы указать, что местоположение было обновлено (т.Е. locationUpdated=1) и установите location=updated_location .

Затем в строке 5 (в приведенном выше примере) Я жду locationUpdated == 1. Затем в строке 6 я могу использовать переменную «местоположение».

Имеет ли смысл писать код таким образом?

В моих экспериментах, если я буду ждать в цикле опроса locationUpdated==1, это вообще предотвратит вызов didUpdateLocations. Так что, может быть, это задание для GrandCentralDispatch поместить цикл ожидания в другой поток? Я никогда им не пользовался.

Комментарии:

1. Вам нужно, чтобы поток приостанавливался во время обновления местоположения? Или вы хотите, чтобы обновления местоположения выполнялись в фоновом режиме, в то время как нормальное выполнение вашей программы продолжается после вызова обновлений местоположения?

2. Обновления местоположения всегда будут доставляться асинхронно методу делегата. Вам не нужно активно «ждать». Вы просто делаете все, что угодно, после вызова метода делегирования. Возможно, вам потребуется указать пользователю, что обработка выполняется.

3. Я хочу, чтобы мой код приостанавливался, пока у меня не будет действительного исправления местоположения. Я хочу использовать эту информацию о местоположении прямо в следующей строке кода (строка 6 в моем примере). Я мог бы обновить глобальную переменную (содержащую местоположение) из метода didUpdateLocation, и строка 6 увидит обновленное значение этой переменной. Звучит как параллелизм для меня … то, что я еще не использовал.

Ответ №1:

Хорошо, друг, ознакомьтесь с этой совершенно приятной документацией API по requestLocation методу!

В основном это говорит:

Этот метод возвращается немедленно. Его вызов приводит к тому, что диспетчер местоположений получает исправление местоположения (что может занять несколько секунд) и вызывает метод LocationManager делегата (_:didUpdateLocations:) с результатом.

Это означает, что если ваш класс подписывается на LocationManager delegate , вы можете поместить строки 5, 6 и 7 в свою реализацию locationManager(_:didUpdateLocations:) .

Таким образом, ваш код будет выглядеть так:

 func whateverFunction() {
    whatever
    whatever
    whatever
    [locationManager requestLocation];
}

func locationManager(_ manager: CLLocationManager, 
       didUpdateLocations locations: [CLLocation]) {
    use the new location information
    whatever
}
  

Надеюсь, это поможет!

Редактировать: на самом деле я думаю, что неправильно прочитал ваш пост. Если это так, прокомментируйте и дайте мне знать, и я постараюсь отредактировать свой ответ.

Комментарии:

1. Спасибо за ваши комментарии. Я мог бы сделать то, что вы предлагаете, но я не хочу использовать новую информацию о местоположении из метода didUpdateLocations. Я хочу использовать эту новую информацию прямо в следующей строке (строка 6) в моей последовательности.

2. @Morocco5 У меня такое чувство, что вы чрезмерно усложняете это и должны найти способ реорганизовать свой код, чтобы вы могли правильно использовать делегатов. Это очень важная парадигма разработки iOS.