【问题标题】:How to fetch the latest document in collection from Firebase Cloud Firestore using Swift如何使用 Swift 从 Firebase Cloud Firestore 中获取最新的文档
【发布时间】:2021-06-03 06:08:50
【问题描述】:

我正在使用以下代码从 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 的结构,其中包含一些虚假数据:

【问题讨论】:

  • 您能否编辑您的问题以包含您的 Firestore 外观的粗略草图?只是想知道,如果它只包含虚假数据而不包含个人数据就更好了。
  • @DiegoJ - 我已经更新了问题,感谢您查看。

标签: swift firebase google-cloud-firestore swiftui


【解决方案1】:

由于您已经获取所有项目,我建议使用本地转换。

在您的视图模型(或存储库)中,使用组合将新订阅者添加到您的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)
  }
}

【讨论】:

  • 这解决了我的问题!非常感谢,谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 2019-07-04
相关资源
最近更新 更多