2017-07-13 21 views
0
@IBAction func signup(_ sender: Any) { 

    print("began signup process") 

    guard let fullname = fullnameField.text, fullname != "" else { 
     print("FULLNAME field is empty") 
     return 
    } 

    guard let username = usernameField.text, username != "" else { 
     print("USERNAME field is empty") 
     return 
    } 

    guard let email = emailField.text, email != "" else { 
     print("EMAIL field is empty") 
     return 
    } 

    guard let password = passwordField.text, password != "" else { 
     print("PASSWORD field is empty") 
     return 
    } 

    print("all fields good") 

    mainActivityIndicator.startAnimating() 

    self.checkUsernameAvailability(username: username, completion: { 
     result in 
     print("starting check") 
     ... 
    }) 


    print("finished the function") 
} 

問題は基本的にcheckUsernameAvailability関数の中に何も呼び出されないことです。関数はSwiftを呼び出しません3

began signup process 
all fields good 
finished the function 

それが始まるのチェック」を印刷したり、機能の中で、すべてのコードを実行されません: コンソールには、次のようになります。 これはおそらくルーキーのエラーであり、愚かな質問であれば申し訳ありません。 将来のありがとう。

P.Sコンソール全体をチェックしましたが、これに関するエラーはありません。

編集:ここにコードがある関数の内部

func checkUsernameAvailability(username: String, completion: @escaping (Bool) -> Void) { 
    _ = Database.database().reference().child("usernames").observe(.childAdded, with: { 
     snapshot in 

     print("checking username availability") 
     print(snapshot) 

     completion(true) 

     let dict = snapshot.value as? [String: AnyObject] 
     for handled in (dict?.values)! { 

      print("stumbled") 
      print(handled) 
      if username.lowercased() == handled.lowercased { 
       completion(false) 
      } 
     } 
    }) 
} 

そして...

self.checkUsernameAvailability(username: username, completion: { 
     result in 

     print("starting check") 

     if result == false { 
      print("username is taken") 
      self.mainActivityIndicator.stopAnimating() 
      return 
     } else { 

      Auth.auth().createUser(withEmail: email, password: password, completion: { 
       (user, error) in 

       if error != nil { 
        print(error ?? "ERROR OCCURED") 
        self.mainActivityIndicator.stopAnimating() 
        return 
       } 

       let ref = Database.database().reference() 
       ref.child("~/users/\(user?.uid ?? "0")/username").setValue(username.lowercased()) 
       ref.child("~/users/\(user?.uid ?? "0")/fullname").setValue(fullname) 
       ref.child("usernames/\(user?.uid ?? "0")").setValue(username.lowercased()) 

       self.mainActivityIndicator.stopAnimating() 
      }) 

     } 
    }) 
+0

'checkUsernameAvailability'のコードも投稿してください。厳密にクロージャー内のテキストは「仕上げチェック」と呼ばれています。 – vadian

+0

''ユーザ名の利用可能性を確認する ''が表示されない場合、データベース呼び出しに何か問題があります。私は、データベースAPIがエラーが発生したかどうかを確認するコードを提供していると確信しています。そして、クロージャー内で 'completion(true/false)'を1回だけ呼び出すべきです。 – vadian

答えて

1

Database.database().reference().child("usernames").observeコールは単にwithブロックを呼び出すことはありません。私は、イベント.childAddedが観察されたときにブロックが呼び出されると仮定しますが、子を追加するコードは見当たりません。私にとっては、これは非同期オブザーバを設定しているように見えるので、コールを行うとこのコードは実行されず、監視されるイベントが発生したときに実行されます。

+0

すごくありがとう、これはそんなに馬鹿な間違いだった。私は、それを変更するのを忘れていました。 –

関連する問題