我正在做的事情很简单。

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,则有多个选项,但最简单的方法是在调用它之前检查布尔标志,并在首次调用它时对其进行更改。

10-06 12:37