2016-07-12 10 views
0

私はguestを登録して入力したユーザ名が利用可能かどうかを調べる小さな関数を開発しました。それにもかかわらず、この関数はiterationとif条件を使用してデバイス上でこれをローカルでチェックします。私は、リストに何千人ものユーザーがいるとき(これは新しいユーザーが正常に作成されるたびにリストが更新される)、将来的にパフォーマンスのボトルネックになる可能性があると考えています。バックエンド側でこれをより効率的に行う方法はありますか?ここでFirebase - 効率的にユーザ名を確認してください

が動作するようになりました関数である。

func checkUsernameTaken(completion: (result: NSError) -> Void) 
    { 
     let errorFound:NSError = NSError(domain: "", code: 0, userInfo: nil) 

     dbReference.child("usernamesTaken").observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot!) -> Void in 
      if(snapshot != nil) 
      { 
       for rest in snapshot.children.allObjects as! [FIRDataSnapshot] { 
        if(rest.value as? String == self.usernameTxtField.text!){ 
         self.isUsernameTaken = true 
        }else{ 
         self.isUsernameTaken = false 
        } 
       } 
       completion(result:errorFound) 
      }else{ 
       self.isUsernameTaken = false 
       completion(result:errorFound) 
      } 
     }) 
    } 

Firebase内のデータ構造はこれです:

the alpha numeric is supposedly the UID and the username is admin

このリストには、以前に述べたが、今はそれがために短いとして成長しますテスト目的のみ。事前に

おかげ

更新:

func usernameValidation(completion: (result: NSError) -> Void) 
    { 
     let errorFound:NSError = NSError(domain: "", code: 0, userInfo: nil) 

     dbReference.child("usernamesTaken").queryEqualToValue(self.usernameTxtField.text!).observeEventType(.Value, withBlock: { (snapshot: FIRDataSnapshot!) -> Void in 

      print(snapshot.childrenCount) 
     }) 
    } 

答えて

3

代わりに自分を検索することで、Firebaseクエリを実行してみましょう。 FIRDatabaseQueryを使用すると、キーや値で子を並べ替えることができます。あなたの場合、queryEqualToValueを使用して、usernameTxtField.textに一致するusernamesTakenの子を見つけることができます。

+0

私のキーが常に変更されているため(UIDであるため)、上記の使用方法がわかりません。あなたの意見を説明するのに役立つ例がありますか? –

+0

私はコードを使って上記の投稿を更新していますが、まだ幸運はありません... –

+0

申し訳ありませんがSwiftを使用していないので、コードをデバッグできません。しかし、それは関連する機能です。 –

関連する問題