2016-12-26 7 views
0

URLRequestが完了するまで実行を保留しようとしています。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()が完了するまでにメインスレッドの待機を行う方法を理解できません。

+0

なぜ下のメインthread.Sampleのそれをラップブロックのセグエ側を実行するだけではないのですか? – Abizern

+0

メインスレッド外のUIを編集することはできません。 –

+0

メイン・キュー内の呼び出しを非同期にすることは、共通のパターンです。 – Abizern

答えて

1

要求のステータスを渡し、操作はUIとは何であるstatus.Ifに基づいて完了ハンドラでアクションを実行するために完了ハンドラを変更し、その後、

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() 
} 
関連する問題