在 viewWillAppear 中为 GeoFire 查询加载用户位置数据

Loading user location data for GeoFire query in viewWillAppear

在我的主 CollectionView(应用程序主页)上,我想根据离用户最近的位置更新位置(即单元格本身)。我将我的位置存储在 Firebase 中,并将使用 GeoFire 和核心位置,以便按照与用户的距离顺序正确列出位置。

其他帖子说观察者的最佳做法是将其加载到 viewWillAppear; 但是,我无法在此运行之前获取用户的位置并且没有我的中心点 GeoFire查询。大多数与 CoreLocation 相关的示例都涉及地图或预选坐标,但我不打算在此控制器中使用地图,而是希望根据用户位置动态加载。

我研究过在 AppDelegate 中加载 didUpdateLocations,但也无法在那里调用该方法。在 viewWillAppear 中加载返回数据时,在 运行 查询 GeoFire 之前获取用户位置坐标的最佳方法是什么,或者您是否需要设置区域并检查用户是否已进入那个地区?

    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)

}

您的代码中缺少很多内容,但简而言之(对我有用的):

.requestLocation in viewWillAppear

.startUpdatingLocation() 在 vi​​ewDidAppear 中。 (所以两次)。

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 
}