繁体   English   中英

如何使用 Swift 从 Firebase Cloud Firestore 获取集合中的最新文档

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM