【发布时间】:2020-09-25 12:44:01
【问题描述】:
我有一个应用程序,其中包含允许用户将餐点上传到 Firebase 以供以后查看,我想显示这些餐点,这些餐点按记录日期排序,并在 TableView 中以降序(按日期)相应地划分。
Meal 对象定义如下
class Meal: NSObject, Codable {
var id: String?
var foodname: String?
var quantity: Float!
var brandName: String?
var quantityType: String?
var calories: Float!
var date: Date?
}
而我的 TableView 目前看起来是这样的
class MealsTableViewController: UITableViewController {
var databaseController: DatabaseProtocol?
var sections = Dictionary<String, Array<Meal>>()
var sortedSections = [String]()
var listOfMeals = [Meal]() {
didSet {
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
databaseController = appDelegate.databaseController
let accountsRef = databaseController?.getAccountsRef()
accountsRef?.document(SingletonAccount.shared.userEmail).collection("meals")
.getDocuments { (querySnapshot, error) in
if error != nil {
print("Error retrieving all meals!")
}else{
do{
for document in querySnapshot!.documents
{
let currentMeal = Meal()
let data = try! document.data()
currentMeal.id = data["id"] as? String ?? ""
currentMeal.brandName = data["brandName"] as? String ?? ""
currentMeal.calories = data["calories"] as? Float ?? 0.0
let parsingDate = data["date"] as! Timestamp
currentMeal.date = parsingDate.dateValue()
currentMeal.foodname = data["foodname"] as? String
currentMeal.quantity = data["quantity"] as? Float
currentMeal.quantityType = data["quantityType"] as? String
print(currentMeal.date)
self.listOfMeals.append(currentMeal)
}
}catch{
print(error)
}
}
}
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return listOfMeals.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "foodCell", for: indexPath)
cell.textLabel?.text = listOfMeals[indexPath.row].foodname
cell.detailTextLabel?.text = String(listOfMeals[indexPath.row].calories) + "kJ"
cell.detailTextLabel?.textColor = UIColor.secondaryLabel
cell.accessoryType = .disclosureIndicator
return cell
}
我也尝试使用下面的代码尝试按日期对对象进行排序,但它不起作用。
self.listOfMeals.sort { (meal1, meal2) -> Bool in
return (meal1.date!.compare(meal2.date!))
}
我尝试了这里发布的其他方法,但它们似乎都不起作用
【问题讨论】:
-
小心使用 getDocuments,因为它会读取整个数据库中的每一餐。随着时间的推移,这可能是数以万计的饭菜,并且试图一次将它们全部加载然后排序可能会使设备不堪重负(而且真的很慢)。添加限制以读取较小的数据部分要好得多。有关更多信息,请参阅我的答案。
标签: swift firebase uitableview google-cloud-firestore tableview