我正在通过Udemy的课程与Firebase,Backendless和Swift构建聊天应用。所有的问题(它是为Swift 2而不是3写的)我已经能够解决自己了,但这个让我感到难过。这个函数应该从Firebase数据库中检索数据,显然它应该作为NSArray检索它,但现在它将它作为NSDictionary检索,它在其他函数中制作了一个巨大的错误列表,因为它'不期待一本字典。
func loadRecents() {
firebase.childByAppendingPath("Recent").queryOrderedByChild("userId").queryEqualToValue(currentUser.objectId).observeEventType(.Value, withBlock: {
snapshot in
self.recents.removeAll()
if snapshot.exists() {
let sorted = (snapshot.value.allValues as NSArray).sortedArrayUsingDescriptors([NSSortDescriptior(key: "date", ascending: false)])
}
})
}
我已经更新到Swift 3:
func loadRecents() {
ref = FIRDatabase.database().reference()
let userId = currentUser?.getProperty("username") as! String
ref.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: userId).observe(.value, with: {
snapshot in
self.recents.removeAll()
if snapshot.exists() {
let values = snapshot.value as! NSDictionary
}
})
}
当然,使用as! NSArray
不起作用。非常感谢它,如果有人可以建议一个方法来更新它以使用Swift 3,按数据中的值对其进行排序,并能够在以后访问它。谢谢!
答案 0 :(得分:2)
func loadRecents() {
ref = FIRDatabase.database().reference()
let userId = currentUser?.getProperty("username") as! String
ref.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: userId).observe(.value, with: {
snapshot in
self.recents.removeAll()
if snapshot.exists() {
let values = snapshot.value as! [String:AnyObject]
}
})}
或者您也可以使用let values = snapshot.value as! [Any]
答案 1 :(得分:1)
希望这会对您有所帮助,请尝试以下代码:
func loadRecents() {
let ref = FIRDatabase.database().reference()
let userId = currentUser?.getProperty("username") as! String
ref.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: userId).observe(.value, with: {
snapshot in
self.recents.removeAll()
guard let mySnapshot = snapshot.children.allObjects as? [FIRDataSnapshot] else { return }
for snap in mySnapshot {
if let userDictionary = snap.value as? [String: Any] {
print("This is userKey \(snap.key)")
print("This is userDictionary \(userDictionary)")
}
}
})
}