我正在尝试使用此功能实时获取值:
handle = ref?.child("Users").child(String(itemId)).observe(.childChanged, with: { (snapShot) in
if let dictionary = snapShot.value as? [String: Any] {
print(dictionary)
if let profileImageUrl = dictionary["url"] as? String {
print(profileImageUrl)
}
}
}, withCancel: nil)
我启动了我的应用程序然后我转到我的firebase控制台并对该孩子进行了一些更改,但我的print()
永远不会被解雇。
这就是我的数据库的样子:
MyRootDb123
-Users
--Id (Child of users)
--- url inside Id
--- name inside Id
--- age inside Id
同样在我的代码中,withCancel
函数做了什么?
更新
我添加了print(snapShot)
,返回:
Snap (url) www.someurl.com
答案 0 :(得分:0)
Firebase对节点密钥名称区分大小写,因此用户与用户不同,而您的代码正在访问用户,但结构是用户。
码
handle = ref?.child("users")
结构
MyRootDb123
-Users
--Id (Child of users)
更新以显示如何将.childChanged观察者附加到用户节点并处理对用户的更改。
让我们从基本的Firebase结构开始
users
uid_0
name: "Leonard"
url: "www.leonard.com
uid_1
name: "Bill"
url: "www.bill.com"
然后我们将.childChanged观察者附加到users节点。当users节点中的子节点发生更改时,更改的节点将传递给闭包。
let usersRef = self.ref.child("users")
usersRef.observe(.childChanged, with: { snapshot in
let userDict = snapshot.value as! [String: AnyObject]
let name = userDict["name"] as! String
let url = userDict["url"] as! String
print("\(name) now has url of: \(url)")
})
要对此进行测试,请在Firebase控制台中将uid_0的url子级从www.leonard.com更改为www.yipee.com,如下所示
users
uid_0
name: "Leonard"
url: "www.yipee.com" //here's the new url
uid_1
name: "Bill"
url: "www.bill.com"
由于更改是在uid_0中,它在上面的代码中传递给闭包的那个节点将打印出来:
Leonard now has url of: www.yipee.com