Martheli
Martheli

Reputation: 981

Running Two Alamofire Requests in Sequence Swift

I am using Async library found here in order to wait for first alamofire request to complete before running my second from the ViewDidLoad. The library seems simple to use but I can never get the first request to wait. My code is as follows:

let group = AsyncGroup()

         group.utility
        {
            self.getToken()
        }

        group.wait()

        self.getDevices()

I would like the getToken function to complete the Alamofire request and its completion handler before moving on to the getDevices request. Both are very simple Alamofire requests.

EDIT:

This is the getToken request. The token variable is not getting updated with the alamofire response before second alamofire request is being called.

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")


                }


        }


    }

Upvotes: 0

Views: 694

Answers (1)

David Berry
David Berry

Reputation: 41226

Your getToken looks more like:

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)
            }
    }
}

and the calling sequence just becomes:

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

    getDevices()
}

Upvotes: 1

Related Questions