swift 中的 Firebase 查询排序顺序?
Firebase query sort order in swift?
当我将以下 Firebase 数据库数据加载到我的 tableView 中时,数据按日期升序排序。如何按降序排列(在顶部显示最新的 post)?
在Xcode中查询:
let ref = self.rootRef.child("posts").queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
JSON 出口:
"posts" : {
"-KMFYKt7rmfZINetx1hF" : {
"date" : "07/09/16 12:46 PM",
"postedBy" : "sJUCytVIWmX7CgmrypqNai8vGBg2",
"status" : "test"
},
"-KMFYZeJmgvmnqZ4OhT_" : {
"date" : "07/09/16 12:47 PM",
"postedBy" : "sJUCytVIWmX7CgmrypqNai8vGBg2",
"status" : "test"
},
谢谢!!
编辑:感谢 Bawpotter
,下面的代码是完整的解决方案
更新查询:
let ref = self.rootRef.child("posts").queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
let post = Post.init(key: snapshot.key, date: snapshot.value!["date"] as! String, postedBy: snapshot.value!["postedBy"] as! String, status: snapshot.value!["status"] as! String)
self.posts.append(post)
self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.posts.count-1, inSection: 0)], withRowAnimation: .Automatic)
tableView cellForRowAtIndexPath
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("PostCell", forIndexPath: indexPath) as! PostCell
self.posts.sortInPlace({[=14=].date > .date})
self.tableView.reloadData()
Post.swift:
import UIKit
class Post {
var key: String
var date: String
var postedBy: String
var status: String
init(key: String, date: String, postedBy: String, status: String){
self.key = key
self.date = date
self.postedBy = postedBy
self.status = status
}
}
当 Firebase 将数据加载到您的 tableView 数据源数组时,请调用:
yourDataArray.sortInPlace({[=12=].date > .date})
Swift 3 版本:
yourDataArray.sort({[=10=].date > .date})
Swift 4 版本:
yourDataArray.sort(by: {[=11=].date > .date})
虽然我确实建议按照张贴的内容创建一个 Class 并按照这种方式进行,但我会给你另一种方法来对它进行排序。
由于您已经从 Firebase 中按升序对其进行了排序并且您知道记录的数量,因此您可以这样做:
guard let value = snapshot.children.allObjects as? [FIRDataSnapshot] else {
return
}
var valueSorted: [FIRDataSnapshot] = [FIRDataSnapshot]()
var i: Int = value.count
while i > 0 {
i = i - 1
valueSorted.append(value[i])
}
只需在使用数据
之前使用.reverse()
示例:
myRef.observe(.value) { (snapshot) in
guard var objects = snapshot.children.allObjects as? [DataSnapshot] else {
return
}
objects.reverse() //<========= HERE
//Now use your `objects`
...
}
Swift 5:
按必填字段排序后,将 reversed() 添加到您的对象中。
例如,假设您在 FireStore 的“日”字段中有一个月中的某一天。
像这样的事情就可以了(在 viewDidLoad 中调用 loadData() 函数来查看输出):
let db = Firestore.firestore()
func loadData() {
db.collection("FireStoreCollectionName").order(by: "day").getDocuments { (querySnapshot, error) in
if let e = error {
print("There was an issue retrieving data from Firestore, \(e)")
} else {
for document in querySnapshot!.documents.reversed() {
let data = document.data()
let fDay = data["day"] as! Int
print(fDay)
}
}
}
}
当我将以下 Firebase 数据库数据加载到我的 tableView 中时,数据按日期升序排序。如何按降序排列(在顶部显示最新的 post)?
在Xcode中查询:
let ref = self.rootRef.child("posts").queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
JSON 出口:
"posts" : {
"-KMFYKt7rmfZINetx1hF" : {
"date" : "07/09/16 12:46 PM",
"postedBy" : "sJUCytVIWmX7CgmrypqNai8vGBg2",
"status" : "test"
},
"-KMFYZeJmgvmnqZ4OhT_" : {
"date" : "07/09/16 12:47 PM",
"postedBy" : "sJUCytVIWmX7CgmrypqNai8vGBg2",
"status" : "test"
},
谢谢!!
编辑:感谢 Bawpotter
,下面的代码是完整的解决方案更新查询:
let ref = self.rootRef.child("posts").queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
let post = Post.init(key: snapshot.key, date: snapshot.value!["date"] as! String, postedBy: snapshot.value!["postedBy"] as! String, status: snapshot.value!["status"] as! String)
self.posts.append(post)
self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.posts.count-1, inSection: 0)], withRowAnimation: .Automatic)
tableView cellForRowAtIndexPath
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("PostCell", forIndexPath: indexPath) as! PostCell
self.posts.sortInPlace({[=14=].date > .date})
self.tableView.reloadData()
Post.swift:
import UIKit
class Post {
var key: String
var date: String
var postedBy: String
var status: String
init(key: String, date: String, postedBy: String, status: String){
self.key = key
self.date = date
self.postedBy = postedBy
self.status = status
}
}
当 Firebase 将数据加载到您的 tableView 数据源数组时,请调用:
yourDataArray.sortInPlace({[=12=].date > .date})
Swift 3 版本:
yourDataArray.sort({[=10=].date > .date})
Swift 4 版本:
yourDataArray.sort(by: {[=11=].date > .date})
虽然我确实建议按照张贴的内容创建一个 Class 并按照这种方式进行,但我会给你另一种方法来对它进行排序。
由于您已经从 Firebase 中按升序对其进行了排序并且您知道记录的数量,因此您可以这样做:
guard let value = snapshot.children.allObjects as? [FIRDataSnapshot] else {
return
}
var valueSorted: [FIRDataSnapshot] = [FIRDataSnapshot]()
var i: Int = value.count
while i > 0 {
i = i - 1
valueSorted.append(value[i])
}
只需在使用数据
之前使用.reverse()
示例:
myRef.observe(.value) { (snapshot) in
guard var objects = snapshot.children.allObjects as? [DataSnapshot] else {
return
}
objects.reverse() //<========= HERE
//Now use your `objects`
...
}
Swift 5: 按必填字段排序后,将 reversed() 添加到您的对象中。 例如,假设您在 FireStore 的“日”字段中有一个月中的某一天。 像这样的事情就可以了(在 viewDidLoad 中调用 loadData() 函数来查看输出):
let db = Firestore.firestore()
func loadData() {
db.collection("FireStoreCollectionName").order(by: "day").getDocuments { (querySnapshot, error) in
if let e = error {
print("There was an issue retrieving data from Firestore, \(e)")
} else {
for document in querySnapshot!.documents.reversed() {
let data = document.data()
let fDay = data["day"] as! Int
print(fDay)
}
}
}
}