我正在做的事情很简单。
class HomeDatasourceController: UICollectionViewController, CLLocationManagerDelegate{
let locationManager:CLLocationManager = CLLocationManager()
//CurrentLocation is my variable that isn't changing on time
var currentLocation = CLLocation(latitude: 5.0, longitude: 5.0)
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
self.locationManager.startUpdatingLocation()
fetchHomeFeed()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
for currentLocationTemp in locations {
self.currentLocation = currentLocationTemp
print("This is latitude: \(currentLocation.coordinate.latitude) , and this is longitude: \(currentLocation.coordinate.longitude)")
}
}
fetchHomeFeed(){
print("Hello: ", self.currentLocation)
}
调用fetchHomeFeed时,它只会打印出我设置为(5.0纬度和经度)的虚拟位置,而不是我的实际位置。
我知道这是异步的,但我不确定至少第一次如何获得呼叫,以便我可以(第一次)正确打印出我的位置。
在此之后,我还需要它继续更新,因为我想实时更新用户的位置。
我试过在func locationManager内放入fetchHomeFeed(),但这多次打印出来(“ Hello:”,self.currentLocation),我只希望fetchHomeFeed()仅被调用一次(具有正确的位置),之后这个位置会被连续调用,因为我将有另一个使用它的方法。
我不确定如何实现这一点。
最佳答案
从documentation for didUpdateLocations:
地点
包含位置数据的CLLocation对象数组。该数组始终包含至少一个表示当前位置的对象。如果推迟更新,或者如果在交付之前到达多个位置,则阵列可能包含其他条目。数组中的对象按照它们发生的顺序进行组织。因此,最近的位置更新在阵列的末尾。
因此,您无需遍历位置数组,只需使用locations.last
即可,除非您的应用程序需要担心推迟的位置更新。
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
currentLocation = location
}
}
而且,如果只希望一次调用
fetchHomeFeed
,则有多个选项,但最简单的方法是在调用它之前检查布尔标志,并在首次调用它时对其进行更改。