【问题标题】:Running Two Alamofire Requests in Sequence Swift在 Sequence Swift 中运行两个 Alamofire 请求
【发布时间】:2017-12-21 08:26:34
【问题描述】:

我正在使用找到here 的异步库来等待第一个 alamofire 请求完成,然后再从 ViewDidLoad 运行我的第二个请求。该库似乎易于使用,但我永远无法获得等待的第一个请求。我的代码如下:

let group = AsyncGroup()

         group.utility
        {
            self.getToken()
        }

        group.wait()

        self.getDevices()

我希望 getToken 函数在继续执行 getDevices 请求之前完成 Alamofire 请求及其完成处理程序。两者都是非常简单的 Alamofire 请求。

编辑:

这是 getToken 请求。在调用第二个 alamofire 请求之前,token 变量没有更新为 alamofire 响应。

func getToken()

    {
        let httpheader: HTTPHeaders =

            [
                "Content-Type": "application/json"
        ]



        // Dev

        let param = [params here]


        Alamofire.request("url", method: .post, parameters: param, encoding: JSONEncoding.default, headers:httpheader).validate()
            .responseData { response in
                switch response.result {

                case .success:
                    if let data = response.data {

                        let xml = SWXMLHash.parse(data)

                        token = (xml["authResponse"] ["authToken"].element?.text)!

                    }

                case .failure:

                  print ("error")


                }


        }


    }

【问题讨论】:

  • responseData 在将要在稍后日期(网络操作完成时)执行的块排队之后立即返回,因此将 getToken 调用包装在 AsyncGroup 中确实对您没有任何帮助。它只是同步 getToken 调用本身的返回。
  • 没关系,我希望第一个 alamofire 请求立即加载并执行。我只想等待第二个请求。
  • 最简单的方法是在第一个的 .responseData 回调中启动第二个请求。

标签: swift asynchronous alamofire grand-central-dispatch


【解决方案1】:

你的getToken 看起来更像:

func getToken(whenDone:(String?)->()) {
    let httpheader: HTTPHeaders = [
            "Content-Type": "application/json"
    ]

    // Dev
    let param = [params here]

    Alamofire.request("url", method: .post, parameters: param, encoding: JSONEncoding.default, headers:httpheader).validate()
        .responseData { response in
            switch response.result {

            case .success:
                if let data = response.data {
                    let xml = SWXMLHash.parse(data)
                    token = (xml["authResponse"] ["authToken"].element?.text)!
                    whenDone(token)
                }

            case .failure:
                print ("error")
                whenDone(nil)
            }
    }
}

调用顺序就变成了:

getToken() { token ->
    guard let token = token else {
        return
    }

    getDevices()
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多