2016-06-04 3 views
0

Ich versuche, für einen bestimmten Benutzer abzufragen, um die neue Firebase wie so mit:kann nicht Wert vom Typ ‚__NSDictionaryM‘, um benutzerdefinierten Benutzerklassen werfen neue Firebase mit

DataService.sharedInstance.REF_USERS.queryOrderedByChild("username").queryEqualToValue(field.text).observeSingleEventOfType(.Value, withBlock: { (snapshot) in 

       if let userDoesNotExist = snapshot.value as? NSNull { 
        print("No User found!") 


       } else { 
        let theUsr = snapshot.value as! User 
        print(theUsr) 


       } 
      }, withCancelBlock: { (error) in 
        // Error 

      }) 

Von dort Ich war auf der Suche zu speichern der Snapshot in ein eigenes Objekt und von dort auf seine Werte zugreifen. Ich versuche, dies zu tun, indem Sie diese:

class User { 

    let key: String! 
    let ref: FIRDatabaseReference? 
    var username: String! 
    var email: String! 


    // Initialize from data snapshot 
    init(snapshot: FIRDataSnapshot) { 
     key = snapshot.key 
     email = snapshot.value!["email"] as! String 
     username = snapshot.value!["username"] as! String 
     ref = snapshot.ref 
    } 

    func toAnyObject() -> AnyObject { 
     return [ 
      "email": email, 
      "username": username, 
     ] 
    } 

} 

Das Problem, das ich in laufende bin ist ein Absturz mit dem folgenden:

Could not cast value of type '__NSDictionaryM' (0x10239efc0) to 'Scenes.User' (0x100807bf0). 

Wie kann ich dieses Problem beheben? Ich kann mich nicht daran erinnern, dass ich auf dem alten Firebase auf dieses Problem gestoßen bin. Ich brauche Zugriff auf den Schlüssel von snapshot.value und kann aus irgendeinem Grund nicht darauf zugreifen, indem ich snapshot.value.key benutze, ohne einen Absturz zu bekommen, also würde ich versuchen, alle Daten in ein eigenes Objekt zu übertragen.

+0

Sie müssen jeweils Kinder wie diese snapshot.childSnapshotForPath einzeln zugreifen ("title"). Wert! Zeichenfolge – Ymmanuel

Antwort

1

snapshot.value ist kein Benutzer, es ist ein Wörterbuch (*)

hier ein paar Optionen - gibt es viele.

let aUser = User() 
aUser.initWithSnapshot(snapshot) 

dann innerhalb der User-Klasse, zeichnen sie die snapshot.values ​​zu den Benutzereigenschaften

oder

let aUser = User() 
aUser.user_name = snapshot.value["user_name"] as! String 
aUser.gender = snapshot.value["gender"] as! String 

Oh, und vergessen Sie nicht, dass durch .Wert Ihren Snapshot kann gibt mehrere untergeordnete Knoten zurück, so dass diese iteriert werden müssen

In Ihrem Fall ist es nur ein Benutzer so Es ist in Ordnung, wie du es hast.

* Es

könnte
NSDictionary 
NSArray 
NSNumber (also includes booleans) 
NSString 
Verwandte Themen