Swift: 如何手动调用CLLocation
Swift: How to manually call CLLocation
所以通常当您尝试使用 CLLocation 获取用户的位置时,您将使用 didUpdateLocations
方法,该方法(如果一切顺利)将在使用 locationManager.startUpdatingLocations()
时被调用。
但我需要能够手动调用获取位置的函数,这样我才能使用完成处理程序。在不使用 didUpdateLocations
方法的情况下开始更新位置后,我如何能够获取用户的位置?
您可以随时访问 CLLocationManager
的 location
属性。这将具有最近确定的位置。如果没有确定位置,则可能为零。
如果您的目标是 iOS 9 及更高版本,那么您可以使用 requestLocation
方法来请求单个位置更新。位置更新将照常传送到 didUpdateLocations
。没有synchronous/blocking"request location, wait for it to update and return the location to me"方法。
你不能"manually call CLLocation"。开始更新位置后,系统开始调用您的 didUpdateLocations
方法。您获得的第一个位置的准确性可能很差。要获得一个好的位置,您确实需要检查准确性并等到找到符合您要求的位置后再接受它。
我还没有使用新的 requestLocation
方法,所以我不知道它如何处理您第一次请求位置时得到的糟糕结果。文档说 "The location fix is obtained at the accuracy level indicated by the desiredAccuracy property" 但据说 startUpdatingLocations
也符合所需的准确性,如果您调用 startUpdatingLocations
时 GPS 关闭,您从中获得的前几个读数往往会非常糟糕。
无论如何,这两种方法都使用 result/results 调用 didUpdateLocations
。
如果您想在获得位置后调用 closure/completion 处理程序,那么我建议您创建自己的位置管理器单例。我们称它为 MyLocationManager
.
您可以给它一个方法 getLocation(completion:)
并让它接受一个完成块。该实现将开始位置更新或调用 requestLocation
(如果该方法第一次返回可靠的位置)。它还会在(可选的)实例变量中保存完成处理程序闭包。在 MyLocationManager 的 didUpdateLocations 实现中,它会检查完成处理程序并在找到时调用它,然后将完成处理程序清零。
所以通常当您尝试使用 CLLocation 获取用户的位置时,您将使用 didUpdateLocations
方法,该方法(如果一切顺利)将在使用 locationManager.startUpdatingLocations()
时被调用。
但我需要能够手动调用获取位置的函数,这样我才能使用完成处理程序。在不使用 didUpdateLocations
方法的情况下开始更新位置后,我如何能够获取用户的位置?
您可以随时访问 CLLocationManager
的 location
属性。这将具有最近确定的位置。如果没有确定位置,则可能为零。
如果您的目标是 iOS 9 及更高版本,那么您可以使用 requestLocation
方法来请求单个位置更新。位置更新将照常传送到 didUpdateLocations
。没有synchronous/blocking"request location, wait for it to update and return the location to me"方法。
你不能"manually call CLLocation"。开始更新位置后,系统开始调用您的 didUpdateLocations
方法。您获得的第一个位置的准确性可能很差。要获得一个好的位置,您确实需要检查准确性并等到找到符合您要求的位置后再接受它。
我还没有使用新的 requestLocation
方法,所以我不知道它如何处理您第一次请求位置时得到的糟糕结果。文档说 "The location fix is obtained at the accuracy level indicated by the desiredAccuracy property" 但据说 startUpdatingLocations
也符合所需的准确性,如果您调用 startUpdatingLocations
时 GPS 关闭,您从中获得的前几个读数往往会非常糟糕。
无论如何,这两种方法都使用 result/results 调用 didUpdateLocations
。
如果您想在获得位置后调用 closure/completion 处理程序,那么我建议您创建自己的位置管理器单例。我们称它为 MyLocationManager
.
您可以给它一个方法 getLocation(completion:)
并让它接受一个完成块。该实现将开始位置更新或调用 requestLocation
(如果该方法第一次返回可靠的位置)。它还会在(可选的)实例变量中保存完成处理程序闭包。在 MyLocationManager 的 didUpdateLocations 实现中,它会检查完成处理程序并在找到时调用它,然后将完成处理程序清零。