Загрузка данных о местоположении пользователя для запроса GeoFire в viewWillAppear

На моей главной CollectionView (домашняя страница приложения), я хотел бы обновить местоположения (то есть сами ячейки) в зависимости от ближайшего местоположения пользователя. Я храню свои местоположения в Firebase и будет использовать GeoFire и местоположение ядра, чтобы правильно перечислить местоположения в порядке расстояния от пользователя.

В других сообщениях говорилось, что лучшая практика для наблюдателей предполагает загрузку в viewWillAppear; однако я не смог получить местоположение пользователя до того, как он запустится, и у меня нет центрированной точки для моего GeoFire запрос. Большинство примеров, связанных с CoreLocation использовать карты или предварительно выбранные координаты, но я не планировал использовать карту в этом контроллере и хочу динамически загружать в зависимости от местоположения пользователя.

Я исследовал нагрузку didUpdateLocations в AppDelegate, но там тоже не удалось вызвать этот метод. Каков наилучший способ получить координаты местоположения пользователя перед запуском GeoFire запрос при загрузке возвращенных данных в viewWillAppear или вам нужно установить регион и проверить, вошел ли пользователь в этот регион?

    var locationDict = [CLLocation]()  //using this variable to pass values outside the function to the query        
    override func viewWillAppear(animated: Bool) {
         locationManager.desiredAccuracy = kCLLocationAccuracyBest
         locationManager.requestAlwaysAuthorization()
         locationManager.startUpdatingLocation()
    }


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let recentLocation = locations[0]
     locationDict.append(recentLocation)     
  }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {

        print(error.localizedDescription)

}

1 ответ

Решение

В вашем коде довольно много не хватает, но вкратце (что работает для меня):

.request Расположение в viewWillAppear

.startUpdatingLocation () в viewDidAppear. (так дважды).

var justStartedUsingMap = true

В didUpdateLocations:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]){

    guard let myLocation:CLLocation = manager.location else {return}
    let location:CLLocationCoordinate2D = myLocation.coordinate
    let region = MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 0.12, longitudeDelta: 0.12))

    if justStartedUsingMap == true {
        self.currentLocationSearch(myLocation)
        justStartedUsingMap = false
    } else {
        locationManager.stopUpdatingLocation()
    }

    self.map.setRegion(region, animated: true)
}

func currentLocationSearch(_ location: CLLocation) {
    // the geofire observer 
}
Другие вопросы по тегам