簡體   English   中英

Swift + Firestore:如何獲取相關對象

[英]Swift + Firestore: How to fetch related objects

我在 Swift 中有這個模型

import SwiftUI
import FirebaseFirestoreSwift
import FirebaseFirestore

struct Tweet: Codable, Identifiable, Hashable {
        
    var id: UUID = UUID()
    var content: String
    var ownerId: String
    var owner: UserProfile
    var likes: Int
    @ServerTimestamp var createdAt: Timestamp?
}

它存儲在 Firestore 集合“推文”中:

tweets: {
    [
        "ds4a65d4a65sd46das65d4": {
            "content" : "safsafds",
            "createdAt" : "...",
            "id" : "sdfsdfsd",
            "likes" : 0,
            "ownerId" : "123",
            "owner" : {
                 "bio": "aaasdasdassa",
                 "username": "asdasd",
                 "profileImage": "aaa",
                 "userId": "123",
             },
        }, ... 
    ]
}

當我獲取所有推文時,我會正常獲取帶有所有者數據的信息。 但所有者數據可能是舊的。 假設用戶更改了他的個人資料圖片或用戶名...等,因此推文所有者數據可能不是最新的。

因此,假設我們要從推文模型中刪除 owner 字段,並保留 ownerId。

如何使用以下模型獲取包含所有者數據的所有推文?

struct Tweet: Codable, Identifiable, Hashable {
        
    var id: UUID = UUID()
    var content: String
    var ownerId: String
    // var owner: UserProfile   <-- THIS IS REMOVED
    var likes: Int
    @ServerTimestamp var createdAt: Timestamp?
}

考慮一下,最基本的例子是當你的對象只有簡單的數據類型時。

            {
              "name": “Sam’s website”,
              "hits": “200”
             }

相應的 Swift 結構可能如下所示:

Struct Website: Identifiable, Codable{
           @DocumentID public let id: String?
           let name: String
           let hits: Int
         }

要將 Firestore 對象導入 Swift,您需要使用 .data(as:) 方法。 在下面的場景中,我獲取 Firestore 集合網站中的所有文檔並將它們放入名為 self.websites 的屬性中

db.collection("websites")
    .addSnapshotListener { (querySnapshot, err) in
      if let err = err {
      print("Error getting documents: \(err)")
     } else {
     guard let documents = querySnapshot?.documents else {
     print("no documents")
     return
    }
  self.websites = documents
       .flatMap { document -> Website in
  return try! document.data(as: Website.self)
      }
   }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM