Swift:暂停代码执行,直到收到 API 响应
Swift: Hold code execution until API response received
我需要设置授权屏幕:
1) 输入登录密码
2) 应用从 API
请求令牌
3) 收到响应
4) 应用检查响应是否包含令牌:如果包含,应执行授权
要解决的问题:应用在第 3 步之前完成 4)
我尝试了什么:我使用转义闭包来暂停执行直到收到 API 数据,但它只起到了部分作用——它只有助于保持对令牌的赋值,但我无法保持'if checks'还在。
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if identifier == "loginSegue" {
let login = loginInput.text!
let password = passInput.text!
tokenLoader.getToken(login: login, password: password) { [weak self] token in
self?.token = token.access_token
}
//THIS CODE I NEED TO HOLD UNTIL DATA FROM API RECEIVED
if token != "" {
return true
} else {
let alert = UIAlertController(title: nil, message: "Incorrect password", preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .cancel, handler: nil)
alert.addAction(action)
present(alert, animated: true, completion: nil)
return false
}
//
} else {
return true
}
}
class TokenLoader {
let session = Session.instance
let baseUrl = "http://46.254.18.193:9096"
func getToken(login: String, password: String, completion: @escaping (AccessToken) -> Void) {
let path = "/token"
let parameters: Parameters = [
"grant_type": "client_credentials",
"client_id": login,
"client_secret": password,
"scope": "read"
]
let url = baseUrl+path
AF.request(url, method: .get, parameters: parameters).responseData { response in
do {
let token = try JSONDecoder().decode(AccessToken.self, from: response.value!)
print(token)
self.session.token = token.access_token
completion(token)
} catch {
print(error)
}
}
}
}
您可以使用此功能解决问题...当您想要 segue 或获取令牌时在事件上执行它
func getTokenAndPerformSegue() {
let login = loginInput.text
let password = passInput.text
if let getLogin = login ,let getPassword = password {
tokenLoader.getToken(login: getLogin, password: getPassword) { [weak self] token in
self?.token = token.access_token
if token.isEmpty() {
let alert = UIAlertController(title: nil, message: "Incorrect password", preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .cancel, handler: nil)
alert.addAction(action)
present(alert, animated: true, completion: nil)
} else {
performSegue(withIdentifier: "loginSegue", sender: nil)
}
}
}
}
你需要这样写...到return nil 或完成时出错
func getToken(login: String, password: String, completion: @escaping (AccessToken?) -> Void) {
let path = "/token"
let parameters: Parameters = [
"grant_type": "client_credentials",
"client_id": login,
"client_secret": password,
"scope": "read"
]
let url = baseUrl+path
AF.request(url, method: .get, parameters: parameters).responseData { response in
do {
let token = try JSONDecoder().decode(AccessToken.self, from: response.value!)
print(token)
self.session.token = token.access_token
completion(token)
} catch {
completion(nil)
print(error)
}
}
}
如果您没有得到任何帮助或需要进一步帮助,请告诉我
我需要设置授权屏幕:
1) 输入登录密码
2) 应用从 API
请求令牌3) 收到响应
4) 应用检查响应是否包含令牌:如果包含,应执行授权
要解决的问题:应用在第 3 步之前完成 4)
我尝试了什么:我使用转义闭包来暂停执行直到收到 API 数据,但它只起到了部分作用——它只有助于保持对令牌的赋值,但我无法保持'if checks'还在。
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if identifier == "loginSegue" {
let login = loginInput.text!
let password = passInput.text!
tokenLoader.getToken(login: login, password: password) { [weak self] token in
self?.token = token.access_token
}
//THIS CODE I NEED TO HOLD UNTIL DATA FROM API RECEIVED
if token != "" {
return true
} else {
let alert = UIAlertController(title: nil, message: "Incorrect password", preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .cancel, handler: nil)
alert.addAction(action)
present(alert, animated: true, completion: nil)
return false
}
//
} else {
return true
}
}
class TokenLoader {
let session = Session.instance
let baseUrl = "http://46.254.18.193:9096"
func getToken(login: String, password: String, completion: @escaping (AccessToken) -> Void) {
let path = "/token"
let parameters: Parameters = [
"grant_type": "client_credentials",
"client_id": login,
"client_secret": password,
"scope": "read"
]
let url = baseUrl+path
AF.request(url, method: .get, parameters: parameters).responseData { response in
do {
let token = try JSONDecoder().decode(AccessToken.self, from: response.value!)
print(token)
self.session.token = token.access_token
completion(token)
} catch {
print(error)
}
}
}
}
您可以使用此功能解决问题...当您想要 segue 或获取令牌时在事件上执行它
func getTokenAndPerformSegue() {
let login = loginInput.text
let password = passInput.text
if let getLogin = login ,let getPassword = password {
tokenLoader.getToken(login: getLogin, password: getPassword) { [weak self] token in
self?.token = token.access_token
if token.isEmpty() {
let alert = UIAlertController(title: nil, message: "Incorrect password", preferredStyle: .alert)
let action = UIAlertAction(title: "OK", style: .cancel, handler: nil)
alert.addAction(action)
present(alert, animated: true, completion: nil)
} else {
performSegue(withIdentifier: "loginSegue", sender: nil)
}
}
}
}
你需要这样写...到return nil 或完成时出错
func getToken(login: String, password: String, completion: @escaping (AccessToken?) -> Void) {
let path = "/token"
let parameters: Parameters = [
"grant_type": "client_credentials",
"client_id": login,
"client_secret": password,
"scope": "read"
]
let url = baseUrl+path
AF.request(url, method: .get, parameters: parameters).responseData { response in
do {
let token = try JSONDecoder().decode(AccessToken.self, from: response.value!)
print(token)
self.session.token = token.access_token
completion(token)
} catch {
completion(nil)
print(error)
}
}
}
如果您没有得到任何帮助或需要进一步帮助,请告诉我