如何使 swift http 请求函数同步/完成处理



我创建了一个同步函数来登录用户,但函数内的 http 请求是 asyc,因此父函数在异步部分发生之前返回 false。我知道我必须以某种方式signingInExtension完成处理的异步函数,然后以与 viewDidLoad 函数不同的方式调用它,我只是无法弄清楚语法。

http 请求还带有一个 completionHandler,但我不明白如何修改它以将其返回值传递到调用它的位置。

override func viewDidLoad() {
signedIn = signingInExtension()
}
func signingInExtension() -> Bool {
if (self.singleUseIdentityToken != nil) {
if (!tokenExpired(t: self.singleUseIdentityToken)) {
let parameters = [
"method": "single-use-identity-token",
"token": self.singleUseIdentityToken!
] as [String : Any]
let url = URL(string: self.endpoint + "/auth/signin")!
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
do {
request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
} catch let error {
print(error.localizedDescription)
}
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
guard error == nil else {
return
}
guard let data = data else {
return
}
do {
if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] {
if (json["token"] == nil) {
return
} else {
print(json["token"] as! String)
// store token in file
// here I would like signingInExtension to return true
// but it already returned false because I am not handling async correctly
}
}
} catch let error {
print(error.localizedDescription)
}
})
task.resume()
}
}
return false // this happens before task
}

我怎样才能从 http 任务完成处理程序中返回truefalse一直到我调用 signingInExtension 的地方?

你需要使用完成处理程序从 signingInExtension(( 返回,如下所示:

func signingInExtension (completion: @escaping (Bool) -> Void)

在这种方法的某个地方,无论你想"返回"登录是否成功,你都会做这样的事情。

completion(true) // or false, or a boolean variable or whatever you need it to return

要获取返回值,您需要执行以下操作。

signingInExtension () { (success)
self.signedIn = success
}

希望这是有道理的。

最新更新