在Swift中,如何编写一个函数,一旦它完成就会触发另一个函数?

时间:2016-06-03 23:51:19

标签: ios swift function closures

我目前有一个返回JSON数据的函数,因为JSON数据是一个访问令牌(函数同时使用AlamoFire和SwiftyJSON):

func getAccessToken (username: String, password: String) {

    //code//

    Alamofire.request(.POST, "\(baseURL)/oauth2/token", parameters: parameters, encoding: .JSON, headers: headers)

        .responseJSON { response in
            if((response.result.value) != nil) {

                let swiftyJsonVar = JSON(response.result.value!)

                self.accessToken = swiftyJsonVar["access_token"].stringValue

            }
    }
}

一旦我获得访问令牌,我想要使用刚刚获得的访问令牌触发另一个函数:

func createNewMember (username: String, password: String, accessToken: String) {
    //code//
}

我想在getAccessToken函数上有一个闭包,它返回访问令牌并触发createNewMember函数,但我不完全确定如何设置它。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

我建议使用completionHandler模式,在getAccessToken调用完成后调用闭包,可以返回令牌或错误:

func getAccessToken (username: String, password: String, completionHandler: (String?, ErrorType?) -> ()) {

    //code//

    Alamofire.request(.POST, "\(baseURL)/oauth2/token", parameters: parameters, encoding: .JSON, headers: headers)
        .responseJSON { response in
            guard let value = response.result.value else {
                completionHandler(nil, response.result.error)
                return
            }

            let swiftyJsonVar = JSON(value)
            completionHandler(swiftyJsonVar["access_token"].string, nil)
    }
}

然后使用完成处理程序闭包调用它:

getAccessToken(username, password: password) { token, error in
    guard let accessToken = token where error == nil else {
        // handle error here

        print(error)
        return
    }

    self.createNewMember(username, password: password, accessToken: accessToken)
}

答案 1 :(得分:-1)

这包括设置 - createNewMember是作为getAccessToken的参数传入的闭包,由调用者实现。通过这种方式,调用者将在检索后接收并决定如何处理访问令牌。

// Added createNewMember as a parameter
func getAccessToken (username: String, password: String, createNewMember:(username: String, password: String, accessToken: String)) {

    //code//

    Alamofire.request(.POST, "\(baseURL)/oauth2/token", parameters: parameters, encoding: .JSON, headers: headers)

        .responseJSON { response in
            if((response.result.value) != nil) {

                let swiftyJsonVar = JSON(response.result.value!)

                self.accessToken = swiftyJsonVar["access_token"].stringValue
                // Call the closure after retrieving the access token
                createNewMember(username, password, self.accessToken)
            }
    }
}