2017-03-02 7 views
1

Dies ist meine zweite Version, die versucht, Code von Firebase abzurufen und Sachen damit zu tun. Dies ist, wie ich es die zweite Art und Weise getan:Kann Daten nicht korrekt von Firebase abrufen

channelRef?.observe(.childChanged, with: { (snapshot) -> Void in 
     let update = snapshot.value as! Dictionary<String, AnyObject> 
     var readyToGoValue: Bool? 
     var userID: String? 
     var amountOfPlayers: Int? 
     var changedCreator: String? 
     if let updatedReadyToGo = update["readyToGo"] as! Bool!{ 
      if updatedReadyToGo == true 
      { 
       readyToGoValue = true 
      } 
      else 
      { 
       readyToGoValue = false 
      } 
     } 
     if let updateduserID = update["userID"] as! String!{ 
      userID = updateduserID 
     } 
     if let updatedAmountOfPlayers = update["currentPlayers"] as! Int!{ 
      amountOfPlayers = updatedAmountOfPlayers 
     } 
     if let updateduserID = update["userID"] as! String!{ 
      userID = updateduserID 
     } 
     if let updatedCreator = update["creator"] as! String!{ 
      changedCreator = updatedCreator 
     } 

     let currentUser = FIRAuth.auth()?.currentUser?.uid 

     if changedCreator != nil 
     { 
      print("changed creator") 
      self.creator = changedCreator! 
     } 

Dieses mit einem Fehlercode abgestürzt:

nicht Wert vom Typ werfen kann ‚__NSCFString‘ (0x10a77f4a0) auf ‚NSDictionary‘ (0x10a780288). an der Zeile "update". Dies war mein erster Versuch:

channelRef?.observe(.childChanged, with: { (snapshot) -> Void in 
     let value = snapshot.value as? NSDictionary 
     let readyToGoValue = value?["readyToGo"] as? Bool ?? false 
     let userID = value?["userID"] as? String ?? "" 
     var amountOfPlayers = value?["currentPlayers"] as? Int ?? 0 
     let changedCreator = value?["creator"] as? String ?? "" 
     print(snapshot) 
     let currentUser = FIRAuth.auth()?.currentUser?.uid 
     print(changedCreator) 
     print(amountOfPlayers) 
     if changedCreator != "" 
     { 
      print("changed creator") 
      self.creator = changedCreator 
     } 

Dies funktioniert nicht anschwellen. Wenn der Schöpfer zu wechseln (nur eine Zeichenfolge) in Firebase, bekomme ich dies als Druck, wenn Druck Hinzufügen (Snapshot):

Schnapp (Konzept) hallo

jedoch die print („geänderte Schöpfer“) nie ausgeführt wird . Warum ist das?

edit: Dies ist, wie ich channelRef ?:

bekam
super.prepare(for: segue, sender: sender) 
if let channel = sender as? Channel { 
    let chatVc = segue.destination as! channelMultiplayerViewController 
    chatVc.channel = channel 
    chatVc.channelRef = channelRef.child(channel.id) 
    chatVc.usersKey = userKey 

} 

Druck mehr Daten:

 print("path channel ref: " + "\(self.channelRef)") 
     print("snapshot: " + "\(snapshot)") 
     print("value: " + "\(value)") 

-path Kanal ref: Optional (https://X.com/channels/-KeGKaJavH6uPYaSa7k4)

-snapshot: Schnapp (Schöpfer) neuer Schöpfer

-Wert: Null

Update:

Datenstruktur:

structure

Dies wird jetzt funktionieren, ist aber nicht, dass es eine bessere Lösung?:

 if snapshot.key == "creator" 
     { 
      changedCreator = snapshot.value as! String 
     } 

Ein weiteres Problem, genau die gleichen wie oben, aber mit der Lösung für das erste Problem, wird dieses Problem nicht gelöst wird erhalten. Wenn ich versuche, den ersten Kind-Knoten zu bekommen, also den ersten Benutzer, und versuche, seine Benutzer-ID zu bekommen, funktioniert nichts. Ich benutze diesen Code:

let firstChild = UInt(1) 
        self.channelRef?.queryLimited(toFirst: firstChild).observeSingleEvent(of: .value, with: { (snapshot) in 
         let value = snapshot.value as? NSDictionary 
         print(snapshot) 
         print(value) 
         let newCreator = value?.value(forKey: "userID") as? String 

         if newCreator != nil{ 
          print("Got the userID") 
         } 
         if snapshot.key == "userID" 
         { 
          print("Got the userID") 
         } 
        }) 
Snap (-KeJWMiXaL-FGp0J7b3u) { 
    "-KeJWO0V9kxgGnrACAtP" =  { 
     PictureVersion = 2; 
     readyToGo = 0; 
     userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; 
     username = pietje; 
    }; 
} 
Optional({ 
    "-KeJWO0V9kxgGnrACAtP" =  { 
     PictureVersion = 2; 
     readyToGo = 0; 
     userID = SZlQ76RLCJQpFa0CDhrgFJoYzrs2; 
     username = pietje; 
    }; 
}) 

Und das druckt aus, so dass keine userID gegeben ist. Warum ist das? Die Benutzer-ID ist genau dort! Ich lese die Dokumentation aber es sollte funktionieren ...

+0

ersetzen können Sie die Zeile enthalten, in dem Sie die 'channelRef?' Variable gesetzt? –

+0

Es ist möglich, dass Sie ihm einen Pfad gegeben haben, der eine Ebene zu tief in Ihre Datenbankstruktur geht, wie '" some_collection/an_object/readyToGo "' anstelle von '" some_collection/an_object "', was erklären würde, warum 'snapshot' als zurückgegeben wird eine Zeichenfolge anstelle eines Wörterbuchs –

+0

Ich habe die Frage bearbeitet. Irgendetwas stimmt nicht, wenn ich die Daten in das Wörterbuch ändere, denke ich – Petravd1994

Antwort

0

Versuchen chatVc.channelRef = channelRef.child(channel.id) mit chatVc.channelRef = channelRef

+0

So wird es jeden einzelnen Raum in Kanälen beobachten, es muss 1 Kanal beobachten. Dieser Kanal wird von channel.id erkannt, daher denke ich, dass dieser Teil funktioniert. – Petravd1994

+0

Ich weiß, was du meinst, aber so beobachtet jede Person in jedem Raum jeden Raum.Ich möchte, dass jede Person in diesem Raum nur diesen Raum beobachtet. Es ist etwas falsch, Wert aus diesem Wörterbuch zu haben. Wenn in diesem Raumkanal eine Karte geändert wird (ich habe Benutzer, die eine getrennte Karte haben), ist dieser Wert nicht Null. – Petravd1994

+0

Ich weiß, dass Sie am Ende Ihrer Frage ein Beispiel für die Datenstruktur angegeben haben, aber können Sie auch angeben, wie es in der Firebase-Datenbank aussieht? Da der Pfad channels/channel-id mindestens ein Schlüssel/Wert-Paar haben muss, um in ein Lexikon –