Swift 3 Firebase更新代码转换 - 排序

inisi 发布于 4 天前 firebase 最后更新 4 天前 1 浏览

我之前在Udemy上注册过一门课程,关于如何使用Swift和Firebase创建聊天应用程序,仅仅是因为我想了解它是如何工作的。 但是,一周后我完成了课程。这是几个月前的事情,从那以后 - 对Firebase和Swift进行了更新,我目前正在努力将一些旧代码转换为新代码。 这是我目前正在努力的代码:

func loadRecents() {
firebase.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: FIRAuth.auth()!.currentUser?.uid).observe(.value) { (snapshot:FIRDataSnapshot) in
self.recents.removeAll()
if snapshot.exists() {
if let values = snapshot.value as? [String:AnyObject] {
let sorted = (values as! NSArray).sortedArray(using: [NSSortDescriptor(key: "date", ascending: false)])
for recent in sorted {
self.recents.append(recent as! NSDictionary)
                        self.conversationTableView.reloadData()
}
}
self.conversationTableView.reloadData()
}
self.conversationTableView.reloadData()
}
self.checkUnread()
}
所以这只是在tableView中显示所有“聊天”的代码,在这里我简单地通过Date对它进行排序,其中升序为false。 我所做的更改仅仅是将旧的snapshot.value.allValues转换为snapshot.value as? [String:AnyObject]。该查询按登录帐户(FIRAuth.auth().currentUser!.uid)排序。 但是,我非常肯定这个代码已被弃用,因为每次构建时都会出现错误。我知道它在以前的版本中有效。 这是错误:
Thread 1: EXC_BAD_INSTRUCTION
如果有必要,而且恰巧我已经完全搞乱了当前的代码(可能是),这里是完整的旧代码:
 func loadRecents() {
        firebase.child("Recent").queryOrderedByChild("userId").queryEqualToValue(FIRAuth.auth()!.currentUser!.uid).observeEventType(.Value, withBlock: {
            snapshot in
self.recents.removeAll()
if snapshot.exists() {
let sorted = (snapshot.value!.allValues as NSArray).sortedArrayUsingDescriptors([NSSortDescriptor(key: "date", ascending: false)])
for recent in sorted {
self.recents.append(recent as! NSDictionary)
//add functio to have offline access as well, this will download with user recent as well so that we will not create it again
firebase.child("Recent").queryOrderedByChild("chatRoomID").queryEqualToValue(recent["chatRoomID"]).observeEventType(.Value, withBlock: {
                        snapshot in
                    })
}
}
self.tableView.reloadData()
        })
self.checkUnread()
}
有关我如何绕过/解决此问题的任何想法?非常感谢帮助。
已邀请:

ysequi

赞同来自:

你必须使用Dictionary() 如果让值=(snapshot.value)为!字典

raut

赞同来自:

我不知道Firebase结构,但如果数据如下所示,这是一个解决方案:

[
  ("post_42", ["date": "2016-09-16"]),
  ("post_12", ["date": "2016-09-19"]), 
  ("post_87", ["date": "2016-09-04"])
]
和一些代码打印按日期排序的数据(这将在块/闭包内)
let dict = snapshot!.value as! [String:[String:String]]
//print the unordered data from the dictionary
for item in dict {
     print(item)
}
let sortedArray = Array(dict).sorted { $0.1["date"]! < $1.1["date"]! }
//print the data sorted by date               
for sortedItem in sortedArray {
     print(sortedItem)
}