[英]How to fetch the latest document in collection from Firebase Cloud Firestore using Swift
我使用下面的代码成功地从 Firebase Firestore 集合中检索文档。 这用于为每个用户创建食品列表。 用户手动添加添加食品的日期。 该日期被用于与 userId 一起对获取的数据进行排序,仅检索该用户的文档。
但是,我希望能够获取添加的最新食品项目,以用于仅显示最新项目的单独视图。 这个最新的项目会随着用户添加更多项目而改变。
我正在努力寻找实现这一目标的最佳方法。 在获取所有 foodItems 后立即将 foodItems[0] 分配给单独的 @Published 变量 'latestFoodItem' 似乎不起作用。
作为初学者,我可能会沿着错误的思路思考...... foodItems 也可能是空的,这给我带来了问题!
func fetchFoodItemsData() {
let userId = Auth.auth().currentUser?.uid
db.collection("foodItems")
.whereField("userId", isEqualTo: userId)
.order(by: "date", descending: true)
.addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.foodItems = documents.compactMap { queryDocumentSnapshot -> FoodItem? in
return try? queryDocumentSnapshot.data(as: FoodItem.self)
}
}
}
这是我的 Cloud Firestore 的结构,其中包含一些虚假数据:
由于您已经在获取所有项目,因此我建议您使用本地转换。
在您的视图 model(或存储库)中,使用 Combine 将新订阅者添加到您的foodItems
。 然后,设置一个管道,通过对食物进行排序然后选择第一个元素来转换食物的集合。 最后,将此值分配给新的已发布属性。
这是我从自己的应用程序之一改编的一些示例代码:
public class FoodItemsRepository: ObservableObject {
// MARK: - Publishers
@Published public var foodItems = [FoodItem]()
@Published public var mostRecentFoodItem: FoodItem?
init() {
// ... other setup
$foodItems.map { items in
items
.sorted { $0.dateAdded > $1.dateAdded }
.first
}
.assign(to: \.mostRecentFoodItem, on: self)
.store(in: &cancellables)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.