从Firebase(Swift 3)中检索和读取数据为NSArray

时间:2016-11-08 01:51:38

标签: ios arrays firebase firebase-realtime-database swift3

我正在通过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,按数据中的值对其进行排序,并能够在以后访问它。谢谢!

2 个答案:

答案 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)")
            }
        }
    })
}