使主线程等待,直到URLRequest完成

时间:2016-12-26 21:20:06

标签: multithreading swift3 ios10

我正在尝试执行直到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()完成。

1 个答案:

答案 0 :(得分:1)

修改完成处理程序以传递请求状态,并根据状态在完成处理程序中执行操作。如果操作与UI有关,则将其包装在主线程中。下面的<.p>

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()
}