2017-02-28 5 views
1

新しいチャンネルが追加されたときに確認する監視ハンドルが追加されました。ユーザーがクリックするとチャンネルをリロードするボタンが付いたobserveSingleEventにしたい。 observeSingleEventは正しく動作しています。これはコードです:Firebaseでobserve to observeSingleEventに変換する際のエラー

private func observeChannels() { 
    channelRefHandle = channelRef.observe(.childAdded, with: { (snapshot) -> Void in 
     self.playersInChannnel.append("\(snapshot.childrenCount)") 
     let channelData = snapshot.value as! Dictionary<String, AnyObject> 
     let id = snapshot.key 
     if let name = channelData["name"] as! String!, name.characters.count > 0 { 
      self.channels.append(Channel(id: id, name: name)) 
      self.tableView.reloadData() 
     } else { 
      print("Error! Could not decode channel data") 
     } 
    }) 
} 

私は今observeSingleEventに変換しようとした、プリントがチャネルデータをデコードすることができませんでした、エラーを言っている置きます。これは私のコードです:

func reloadChannels() 
{ 
    channelRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in 
     self.playersInChannnel.append("\(snapshot.childrenCount)") 
     let channelData = snapshot.value as! Dictionary<String, AnyObject> 
     let id = snapshot.key 
     if let name = channelData["name"] as! String!, name.characters.count > 0 { 
      self.channels.append(Channel(id: id, name: name)) 
      self.tableView.reloadData() 
     } else { 
      print("Error! Could not decode channel data") 
     } 
    }) 
} 

このコードで何が問題になっていますか?これはobserveSingleEventからのスナップショットのプリントです:

Snap (channels) { 
    "-Ke3g8tLH9A-_iTVjQhq" =  { 
     "-Ke3g8tO2XPCbyIjP4Op" =   { 
      PictureVersion = ""; 
      userID = keVlTMUXyRViUsTVjTnKdvZs7mg1; 
      username = pietje; 
     }; 
     name = test; 
    }; 
    "-Ke3gFbijlcQGuJXe42L" =  { 
     "-Ke3gFbjsEgpA3wjM1Jv" =   { 
      PictureVersion = ""; 
      userID = keVlTMUXyRViUsTVjTnKdvZs7mg1; 
      username = pietje; 
     }; 
     name = test2; 
    }; 
} 
Error! Could not decode channel data 

また、observeChannels()はエラーを表示していません。ありがとうございました。

答えて

2

observeからobserveSingleEventに変更しただけではなく、.childAddedを観察して.valueに変更しました。 .valueを聞いているので、スナップショットにはすべて子ノードが一度に(一致する子が1つのみであっても)含まれています。

func reloadChannels() 
{ 
    channelRef.observeSingleEvent(of: .value, with: { (snapshot) -> Void in 
     self.playersInChannnel.append("\(snapshot.childrenCount)") 
     for channelSnap in snapshot.children { 
      let channelData = (channelSnap as! FIRDataSnapshot).value as! Dictionary<String, AnyObject> 
      let id = (channelSnap as! FIRDataSnapshot).key 

      if let name = channelData["name"] as! String!, name.characters.count > 0 { 
       self.channels.append(Channel(id: id, name: name)) 
       self.tableView.reloadData() 
      } else { 
       print("Error! Could not decode channel data") 
      } 
     } 
    }) 
} 

がどのようにオーバーループへの詳細については、この質問への回答を参照してくださいする前に

このような理由から、あなたが持っていたチャンネルのデータを取得するには、スナップショットの子供をループにする必要がありますスナップショットの子供:Iterate over snapshot children in Swift (Firebase)

+0

ありがとうございます。私はchannelSnapを追加する必要がありました! FIRDataSnapshotを有効にする – Petravd1994

+0

ああ、ええと....私はスウィフトの呪文については決してわかりません。それを聞いてうれしいです。自分の答えを編集してコードスニペットを追加できますか?さもなければ私は間違った場所に置くでしょう。 –

+0

それをしました!ありがとうございました :)。 – Petravd1994

関連する問題