2017-03-04 29 views
2

タイトルが間違っているように見えるかもしれませんが、これをどうやって行うのかを理解しようとしています。私のデータ構造は次のようになります。私は、すべてのチャネルで提供ユーザーがいる場合を見てみたいFirebaseの子供の子供のデータをチェックする方法

data structure

channelRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in 
for channelSnap in snapshot.children { 
let channelData = (channelSnap as! FIRDataSnapshot).value as! Dictionary<String, AnyObject> 
if let name = channelData["name"] as! String!, name.characters.count > 0 { 
} 
}) 

コースチェックのこの意志が名前というプロパティを持つ子供があり、もしそうなら、ものを行う場合:これは、チャネルが存在するかどうかをチェックしていきます。私がやりたいことは、すべてのチャンネルの子どもたち(チャンネルのユーザー)を通るループ(チャンネル)です。私は、チャネルに子供がいるかどうかをチェックし、そうでなければそのチャンネルを削除したい。どのようにチャンネルの子供たちの子供たちをループするか?

これは、チャネル内のユーザーませ出力しません:

channelRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in 
      for channelSnap in snapshot.children { 
       for child in (channelSnap as AnyObject).children { 
        let usersData = (child as! FIRDataSnapshot).value as? Dictionary<String, AnyObject> 
        if let randomUser = usersData?["userID"] as! String!{ 
         print("user in the channel") 
        } 
        else 
        { 
         print("no user in channel") 
        } 
       } 

編集.KEY

のlet ID =(FIRDataSnapshotなどchannelSnap!):私は、この関数を呼び出すことによって、すべてのチャンネルのIDへのアクセス権を持っています

編集2:

これはスナップショットの印刷であり、channelSnapの印刷にはがあり、その中にユーザーがいる

SNAPSHOT: Snap (channels) { 
    "-KePh6YFmQqQ6ZhEfTHn" =  { 
     "-KePh6YHPLSAIEARfj-i" =   { 
      PictureVersion = 2; 
      readyToGo = 0; 
      userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; 
      username = pietje; 
     }; 
     creator = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; 
     currentPlayers = 1; 
     entryFee = 100; 
     gameType = normal; 
     maximumPlayers = 4; 
     name = "random channel"; 
     password = ""; 
    }; 
} 
CHANNELSNAP: Snap (-KePh6YFmQqQ6ZhEfTHn) { 
    "-KePh6YHPLSAIEARfj-i" =  { 
     PictureVersion = 2; 
     readyToGo = 0; 
     userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; 
     username = pietje; 
    }; 
    creator = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; 
    currentPlayers = 1; 
    entryFee = 100; 
    gameType = normal; 
    maximumPlayers = 4; 
    name = "random channel"; 
    password = ""; 
} 

答えて

1

users in channel?

は、チャネル内のユーザーKeJTqVREbMEmtD0oAk4ですか?もしそうなら、あなたがそれらに関するすべての情報を保管するusersのキーを持つことはいいと思う...

exampleキーはあなたのチャンネルに対応します。その中にはother_infoがあり、そのチャンネルに関する情報になります。次に、usersがあります。チャンネル内のすべてのユーザーが同じ状態に保たれます。

enter image description here

その後channelSnap.child("users").valueはそのチャンネル内のすべてのユーザーを持っているでしょう。あなたが好きなものを持つユーザーが存在するかどうかをチェックすることができ

:プレーヤーを持っており、データを取得する場合は、プレーヤーのためのキーを作成した場合

if let dict = channelSnap.child("users").value as? [String: Any] { 
    if dict.count == 0 { 
     // no users 
    } else { 
     // you got users 
    } 
} 
+0

:データをキャッチする Will look like this:

はこのようになります。これはうまくいくかもしれませんが、私はそれを私のやり方でしたいと思います。そのチャンネルのすべてのユーザーは1つのユーザーIDを持つことになっているので、 "userID"というキーをチャンネルで検索することは可能ですか? userIDのキーがない場合、ユーザーは存在しません。これが可能かどうか聞いてみたい! – Petravd1994

+0

ええ..できますが、問題は 'userId'がradom idの中にあることです。だから、どこでも検索する必要があります。あなたがそのキーへの参照をどこかで持っていない限り、 –

+0

それをしたいなら、channelSnap.childrenに別の 'for'を追加しなければなりません。 shapshow.childrenのchannelSnapの' '' { for channelSnap.childrenの子{ //ここでuserIdを探してください } } '' ' –

1

は簡単にチェックできます。はい、KeJTqVREbMEmtD0oAk4はランダムなユーザーである

ref.child("channels").observeSingleEvent(of: .childAdded, with: { (snapshot) in 
     guard let data = snapshot.value as! [String:AnyObject]? else { return print("Snapshot error!")} 
     if let player = data["players"] { 
      for player in player as! [String:[String:AnyObject]] { 
       print(player.key) 
       print(player.value as Any) 
      } 
     } else { 
      print("No player found!") 
     } 
    }) 
関連する問題