无法使用新的Firebase将“__NSDictionaryM”类型的值转换为自定义用户类

时间:2016-06-04 02:58:09

标签: swift firebase firebase-realtime-database

我正在尝试使用新的Firebase查询特定用户,如下所示:

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

            })

从那里开始,我希望将快照存储到自己的对象中并从那里访问其值。我试图这样做:

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,
        ]
    }

}

我遇到的问题是以下崩溃:

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

我该如何解决这个问题?我不记得在旧版Firebase上遇到此问题。我需要访问snapshot.value的密钥,由于某种原因无法通过使用snapshot.value.key访问它而不会发生崩溃所以我想我会尝试将所有数据传递给它自己的对象。

1 个答案:

答案 0 :(得分:1)

snapshot.value不是用户,它是字典(*)

这里有几个选项 - 有很多选择。

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

然后,在User类中,将snapshot.values映射到用户属性

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

哦,不要忘记使用.Value你的快照可能会返回多个子节点,因此需要迭代这些节点

for child in snapshot.children {
  let whatever = child.value["whatever"] as! String
}

在你的情况下,它只是一个用户,所以你拥有它的方式很好。

*可能是

NSDictionary
NSArray
NSNumber (also includes booleans)
NSString