我目前有一个返回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
函数,但我不完全确定如何设置它。任何帮助表示赞赏!
答案 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)
}
}
}