[英]Make main thread wait until URLRequest finishes
我试图保持执行直到URLRequest完成。
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
self.sendRequest(request: request as URLRequest) {
}
self.firebaseAuth(credential)
self.performSegue(withIdentifier: SEGUE_TO_FIRST_CONTENT_PAGE, sender: nil)
}
func sendRequest (request: URLRequest, completion: @escaping () -> ()) {
let session = URLSession.shared
session.dataTask(with: request as URLRequest) { (data, response, error) in
UIApplication.shared.isNetworkActivityIndicatorVisible = false
do {
let userData = try JSONSerialization.jsonObject(with: data!, options:[]) as? [String:AnyObject]
let genderData = userData!["gender"] as! String
self.userObject.gender = genderData
completion()
} catch {
completion()
print("ERROR")
}
print("sendRequest Done!")
}.resume()
}
现在,它甚至在完成sendRequest()之前就执行segue。 我不知道如何使主线程等待直到sendRequest()完成。
修改完成处理程序以传递请求状态,并根据状态在完成处理程序中执行操作。如果操作与UI有关,则将其包装在主线程中。
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
self.sendRequest(request: request as URLRequest){ (loginStatus) in
if loginStatus {
DispatchQueue.main.async {
self.firebaseAuth(credential)
self.performSegue(withIdentifier: SEGUE_TO_FIRST_CONTENT_PAGE, sender: nil)
}
}
else{
//Handle Error case
}
}
}
func sendRequest (request: URLRequest, completion: @escaping (Bool) -> ()) {
let session = URLSession.shared
session.dataTask(with: request as URLRequest) { (data, response, error) in
UIApplication.shared.isNetworkActivityIndicatorVisible = false
do {
let userData = try JSONSerialization.jsonObject(with: data!, options:[]) as? [String:AnyObject]
let genderData = userData!["gender"] as! String
self.userObject.gender = genderData
completion(true)
} catch {
completion(false)
print("ERROR")
}
print("sendRequest Done!")
}.resume()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.