@IBaction func login
の文中に私はstartObserving()
と呼んでいます。メインスレッドで実行されないのはなぜですか?
この文print("executed")
は、self.startObservingDB(callback: { (snapValue) in
のコードがelse文で評価される前に実行されます。 FirebaseからsnapValueを受け取る前に、startObservingDBが復帰しないようにします。 else文でstartObservingDBをどのようにしてFirebaseがそのタスクを完了してから実行を続けるのを待つことができますか?タスクを順番に実行する方法は? Swift3
@IBAction func logIn(_ sender: AnyObject) {
FIRAuth.auth()?.signIn(withEmail: email.text!, password: password.text!, completion: { (authData, error) in
if error != nil {
//
} else {
self.startObservingDB(callback: { (snapValue) in
if snapValue != nil {
print("should segue")
self.performSegue(withIdentifier: "LogInToTabBarController", sender: self)
}
})//end of startObservingDB
//prints before code in else statement, inside self.startObservingDB(callback: { (snapValue) is evaluated
print("executed")
}
})
}
func startObservingDB(callback:@escaping ((_ snapShot:FIRDataSnapshot?) -> Void)){
// check if user is singed in
guard let uid = FIRAuth.auth()?.currentUser?.uid else {
return
}
dbRef.child(uid).child("profile").observeSingleEvent(of: .value, with: { (snapshot: FIRDataSnapshot) in
//pass snapshot vale to callback closure so as to make the values available when calling startObservingDB
callback(snapshot.value as? FIRDataSnapshot)
}, withCancel: { (Error:Any) in
print("Error firebase \(Error)")
print("You are not a cleaner")
})
dbRef.removeAllObservers()
} // end of startObserving
は、どのように私は私の方法startObservingDBは、スレッドB 'まで待機することができます:コールバック(snapshot.valueなどを実行FIRDataSnapshot? ) '終了しますか?私は 'self.startObservingDB(コールバック:{(snapValue)in'}の中で' if snapValue!= nil'をチェックする必要があり、これが起きるためにfirebaseが作業を終了するまで 'startObservingDB'を待たなければなりません。ありがとうございました – bibscy
ブロックがどのように動作しているか誤解していると思いますが、あなたは既に言及した動作を得ています。 'callback(FIRDataSnapshotとしてのsnapshot.value)'が実行されると、この呼び出しは 'self.startObservingDB(コールバック:{(snapValue)in'です。メソッドを呼び出すのと同じコードで、そのメソッドでコードを実行します。 –