Swift-Alamofire完成的等待时间

时间:2019-07-12 09:47:56

标签: swift alamofire

我只是想获得城市的纬度和经度。但是在alamofire完成请求之前,我收到了0.0的定义值,这不是我想要的值。我确实获得了经度和纬度的值,但已经传递了0.0,所以应用程序仅接受该值。

我尝试了完成块,但是没有成功。我在这里和那里尝试了一些小技巧,但没有任何效果。我应该如何改善呢?

func getAddress(address:String){

    let key : String = "<API_KEY>"
    let postParameters:[String: Any] = [ "address": address,"key":key]
    let url : String = "https://maps.googleapis.com/maps/api/geocode/json"
    var lat = 0.0
    var long = 0.0

    Alamofire.request(url, method: .get, parameters: postParameters, encoding: URLEncoding.default, headers: nil).responseJSON {
        response in if let receivedResults = response.result.value
        {
            let resultParams = JSON(receivedResults)
            print(resultParams["status"]) // OK, ERROR
            lat = resultParams["results"][0]["geometry"]["location"]["lat"].doubleValue// approximately latitude
            long = resultParams["results"][0]["geometry"]["location"]["lng"].doubleValue // approximately longitude
            print("Here i am \(self.destLatitude)")
        }
        self.destLatitude = lat
        self.destLongitude = long
        print("Here i am also \(self.destLatitude)")
    }
}

预期输出是一个地方的经度和纬度。

2 个答案:

答案 0 :(得分:2)

网络请求异步工作,将值分配给完成处理程序中的属性

Alamofire.request(url, method: .get, parameters: postParameters, encoding: URLEncoding.default, headers: nil).responseJSON {
    response in if let receivedResults = response.result.value
    {
        let resultParams = JSON(receivedResults)
        print(resultParams["status"]) // OK, ERROR
        lat = resultParams["results"][0]["geometry"]["location"]["lat"].doubleValue// approximately latitude
        long = resultParams["results"][0]["geometry"]["location"]["lng"].doubleValue // approximately longitude
        self.destLatitude = lat
        self.destLongitude = long
        print("Here i am \(self.destLatitude)")
    }
}

答案 1 :(得分:-1)

您可以尝试以下方法:

    let group = DispatchGroup()

    group.enter()
     Alamofire.request(url, method: .get, parameters: postParameters, encoding: URLEncoding.default, headers: nil).responseJSON {
    response in if let receivedResults = response.result.value {
        let resultParams = JSON(receivedResults)
        print(resultParams["status"]) // OK, ERROR
        lat = resultParams["results"][0]["geometry"]["location"]["lat"].doubleValue// approximately latitude
        long = resultParams["results"][0]["geometry"]["location"]["lng"].doubleValue // approximately longitude
        print("Here i am \(self.destLatitude)")

        group.leave()
    }


    group.notify(queue: .global(qos: .userInitiated)) {
        self.destLatitude = lat
        self.destLongitude = long
        print("Here i am also \(self.destLatitude)")
    }