簡體   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