我一调用此方法就有一个通用函数 genParam(),我想返回当前用户 GPS 位置以及其他参数。但在我的例子中,genParam() 在调用委托(delegate)方法 didUpdateLocations 之前立即返回。是否有在返回 genParam() 之前等待委托(delegate)方法被调用的任何方式。
class CommonApiParamGenerator: NSObject,CLLocationManagerDelegate {
var locationManager = CLLocationManager()
var userGPSLoc:String = ""
func genParam(locationName:String)->NSMutableDictionary{
self.getUserLocation()
let guid = NSUUID().UUIDString
let userName = SingleTon.sharedInstance.getUserName()
let gpsLoc = self.userGPSLoc
let commonParam = NSMutableDictionary(objects: [guid,userName,gpsLoc], forKeys: ["guid","userName","gpsLoc"])
return commonParam
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
let userLocation:CLLocation = locations[0] as CLLocation
self.userGPSLoc = "\(userLocation.coordinate.latitude),\(userLocation.coordinate.longitude)"
print("receivedGPS \(self.userGPSLoc)")
manager.stopUpdatingLocation()
}
func getUserLocation()
{
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
}
}
最佳答案
首先,根据单一职责原则,我建议您通过在单独的类中获取位置来移动您的代码:
class LocationManager: NSObject, CLLocationManagerDelegate {
let manager = CLLocationManager()
private var completion: ((CLLocation) -> Void)?
override init() {
super.init()
manager.delegate = self
manager.desiredAccuracy = kCLLocationAccuracyBest
}
func getLocation(completion: (CLLocation) -> Void) {
self.completion = completion
manager.requestWhenInUseAuthorization()
manager.startUpdatingLocation()
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
let userLocation = locations[0] as CLLocation
manager.stopUpdatingLocation()
self.completion?(userLocation)
}
}
然后重构你的类:
class CommonApiParamGenerator: NSObject {
var userGPSLoc:String = ""
var locationManager = LocationManager()
func genParam(locationName:String, completion: (NSMutableDictionary) -> Void) {
let guid = NSUUID().UUIDString
let userName = SingleTon.sharedInstance.getUserName()
locationManager.getLocation { location in
let userGPSLoc = "\(location.coordinate.latitude),\(location.coordinate.longitude)"
completion(NSMutableDictionary(objects: [guid,userName,userGPSLoc], forKeys: ["guid","userName","gpsLoc"]))
}
}
}
用法:
let generator = CommonApiParamGenerator()
generator.genParam(locationName) { params in
...
}
主要思想是使用回调进行异步操作。
如果你不喜欢回调,或者有很多嵌套回调(回调 hell ),你可以 PromiseKit: http://promisekit.org/ . 祝你好运!
关于ios - 如何等到位置经理代表 swift 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39445215/