2017-02-28 5 views
1

Ich habe jetzt einen Object-Handle, der prüft, wenn neue Kanäle hinzugefügt werden. Ich möchte, dass es sich um ein observeSingleEvent mit einer Schaltfläche handelt, die die Kanäle neu lädt, wenn der Benutzer darauf klickt. Das observeSingleEvent funktioniert ordnungsgemäß. Dies ist der Code:Fehler beim Konvertieren in observeSingleEvent in Firebase

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") 
     } 
    }) 
} 

Ich habe versucht, jetzt ist es zu observeSingleEvent Umwandlung, setzen die Druckfehler zu sagen, konnte nicht Kanaldaten dekodieren. Das ist mein Code:

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") 
     } 
    }) 
} 

Was ist falsch an diesem Code? Dieses ist ein Druck des Schnappschusses aus 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 

Wieder Brennen observeChannels() keine Fehler angezeigt wird. Vielen Dank.

Antwort

2

Sie haben nicht nur observe-observeSingleEvent ändern, müssen Sie eingeschaltet auch .childAdded zu beobachten .value aus der Beobachtung. Und da Sie nun nach einer .value lauschen, bedeutet dies, dass der Snapshot, den Sie erhalten, alle die untergeordneten Knoten gleichzeitig enthält (selbst wenn es nur ein passendes Kind gibt).

Aus diesem Grund werden Sie in einer Schleife über die Kinder des Schnappschusses benötigen, Sie hatten die Kanaldaten zu erhalten, bevor:

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") 
      } 
     } 
    }) 
} 

die Antworten für mehr auf diese Frage finden, wie die Schleife über Kinder eines Schnappschusses: Iterate over snapshot children in Swift (Firebase)

+0

Danke. Ich musste ChannelSnap als hinzufügen! FIRDataSnapshot, damit es funktioniert. – Petravd1994

+0

Ah, yeah .... Ich bin mir über diese Beschwörungen in Swift nie sicher. Freut mich zu hören, es war genug. Können Sie meine Antwort bearbeiten, um das Code-Snippet hinzuzufügen? Sonst Chancen, ich werde es an die falsche Stelle setzen. –

+0

Habe es getan! Danke nochmal :). – Petravd1994

Verwandte Themen