Загрузка данных о местоположении пользователя для запроса 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
}