ios - 如何等到位置经理代表 swift 调用?

标签 ios iphone swift cllocationmanager

我一调用此方法就有一个通用函数 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/

相关文章:

iOS EventKit 附加谓词

ios - 定义 UIViewController 或 UIView 的自定义框架

javascript - 如何在没有 Xcode 的情况下手动安装 Phonegap 库?

iphone - 检测 UIDatePicker 是否在滚动?

iphone - 核心数据迁移 - 这是一个简单的迁移吗?应该如何完成?

在闭包中调用函数时的快速强链接

ios - swift 3 : How to scan for peripherals in background?

ios - 一旦我从分享扩展分享到我的应用程序的链接,Safari 就会被卡住

ios - Swift 3.0 过滤器功能不起作用

ios - 将 iOS 扩展注册到 URL 方案