在 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() 在 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
}
在我的主 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() 在 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
}