2016-04-14 3 views
0

新しいユーザが自分のユーザ名、パスワード、ニックネームを追加する必要がある小さなユーザログインフォームがあります(基本的なfirebase authはユーザ名として電子メールのみ受け付けます)。 )。ニックネームとユーザ名:ユーザを作成する前にFirebaseにデータが存在するかどうかをチェック

これは、私はキーがユーザ名に基づいて、それは2人の子供を持っているニックネームを受信するFirebaseにenter image description here

を作成したユーザーの構造です。

Firebaseのauthメソッドを使用してユーザーを作成する前に、ニックネームがすでに存在するかどうかを確認するためにクエリを実行します。はいの場合、ユーザーは作成されずアラートがスローされます。ニックネームが存在しない場合は、ユーザーを作成し、上記のイメージからニックネームをユーザー構造に追加します。

ここで(コードは 'observeSingleEventOfType'を飛ばして、ニックネームが既に存在するかどうかを確認する前にcreateUserを実行していました)、思っていましたが、createUserコードを取得して'snapshot.exists()'の 'else'のようにニックネームクエリのobserveSingleEventOfType内に直接...

これは動作しているようですが、正しいかどうかわかりませんそれを行う方法...

それを行う別の方法(よりよい方法)はありますか?

以下のとおりです。 ありがとう!

func createUser(username: String, password: String, nickname: String){ 

    var userCreated = false 
    var errorCode = 0 

    users.queryOrderedByChild("Nickname").queryEqualToValue(nickname).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 
     if snapshot.exists() { 
      errorCode = 3 
      self.delegate?.didReceiveResponseFromFirebaseCreateUser!(userCreated, errorCode: errorCode) 
     } 
     else{ 
      self.ref.createUser(username, password: password, withCompletionBlock: { (error) in 
       if error != nil { 
        print (error.description) 

        if error.description.rangeOfString("EMAIL_TAKEN") != nil { 
         errorCode = 1 
        } 
        else if error.description.rangeOfString("INVALID_EMAIL") != nil { 
         errorCode = 2 
        } 

       } 
       else{ 
        userCreated = true 
        let newUser = User(username: username, nickname: nickname) 

        let newUserRef = self.users.childByAppendingPath(username.stringByReplacingOccurrencesOfString(".", withString: "-")) 
        newUserRef.setValue(newUser.toAnyObject()) 

       } 

       self.delegate?.didReceiveResponseFromFirebaseCreateUser!(userCreated, errorCode: errorCode) 

      }) 
     } 


    }) 
} 
+1

この質問にはもう必要ありませんが、一般的には:あなたの質問のJSONツリーの画像は、JSONをテキストとして持つほど便利ではないことにご留意ください。あなたのFirebaseデータベース。 JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。 –

答えて

3

私は最後のFirebaseアプリケーションを構築していたときに同じ問題に直面しました。私が解決するために使用した方法は、ユーザー名からユーザーIDへの追加のマッピングを作成することでした。だから私の構造はそのような何か(uidがFirebase認証からユーザーIDです)になります。

users: { 
    accounts: { 
     uid1: { 
      username: frank, 
      ... 
     }, 
     uid2: { 
      username: monique, 
      ... 
     } 
     ... 
    }, 
    username_to_uid: { 
     frank: uid1, 
     monique: uid2, 
     ... 
    } 
} 

をこの2つの主要な事を許可します。

  1. 、ユーザが登録しようとしますが、ユーザー名と彼ならば、あなたが最初に確認することができます提供はすでに "username_to_uid"マッピングを使用して存在しています
  2. ユーザ名とパスワードを使用してログインすることもできます。デフォルトでは、Firebase認証を使用して電子メールとパスワードでログインすることができます。ここでは、所与のユーザ名に対して、「username_to_uid」マッピングを使用してこのユーザ名に関連付けられたuidを簡単に取得できるので、ユーザ名とパスワードでログインすることができます。
+0

うわー!いい考えだ!私はここでそれを試してみましょう。私は確かにそれを試してみましょう。 ありがとうございます! –

+0

@ LucasAlmeidaそれを聞いてうれしい! – pkacprzak

+0

確かに認証プロセスをより良くするために(電子メールの代わりにニックネームを使用して)便利ですが、firebase-swiftの問題については、私がそれを現在の方法で保持するかどうかを判断する必要があります... observeSingleEventOfTypeはブロックが実行される前にcreateUserを実行し、存在するニックネームに対してtrueを返す変数がfalseとして送信されていたため、複数のユーザーが同じニックネームで作成されていました。その理由は、observeSingleEventOfTypeのブロック内にcreateUserコードを挟んだ理由です... –

0

はちょうど私がFirebaseイベントオブザーバーとしていた同期の問題上のヘッドアップ:(それは呼んでいた別のViewControllerを開くためにセグエを呼び出すときに

昨日、私はそれが働いていたと思った、私は問題を持っていました新しいビューはObserverがまだ実行されていない状態で、デリゲートメソッドが使用していたためにアプリケーションがクラッシュしました)...

解決策として、私はすべての代理人を取り除き、完了ハンドラを使用するメソッド...今は本当に上手く行く!

ああ、@pkacprzak:私は変更を加え、ニックネームとuidの関係を保存するためにこの 'ブリッジ構造'を使い始めました。男、今は蹴って!大変ありがとうございました!

+0

恐ろしい!補完ハンドラについて言えば、非同期タスクをチェーン化するという大きなコンセプトがあります – pkacprzak

関連する問題