首页 > 解决方案 > 使用 Swift 和 Firestore 解码嵌套对象

问题描述

我正在使用 Swift 5 和 Firestore 开发应用程序。我创建了 structs Identifiables 和 Codables,它运行良好,但我在解码嵌套文档的 DocumentID 时遇到问题。我在网上找不到类似的东西。我想知道我实现的 Firestore 结构是否适合我的用例以及如何解决 id 问题。

我必须显示一个活动列表,其中仅包含有关用户和运动的一些信息(例如名称和图像)。这就是为什么我试图在 Activity 对象中嵌套我不需要为列表的每个活动查询整个用户和运动的信息。

在 Firestore 上:

活动文件包含:

info (String)
organizer:
     - name (String)
     - image (String)
     - ref (Reference)
date (Date)
sport:
     - name (String)
     - image (String)
     - ref (Reference)

这是我的代码:

import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift

struct User: Codable {
    @DocumentID var id: String? = UUID().uuidString
    
    let name: String
    let email: String?
    let image: String
    let birthday: Date?
    let description: String?
}

struct Sport: Codable {
    @DocumentID var id: String? = UUID().uuidString
    
    let name: String
    let image: String
}

struct Activity: Codable {
    @DocumentID var id: String? = UUID().uuidString
    
    let organizer: User
    let info: String
    let date: Date
    let sport: Sport

    static func getActivities(completion: @escaping (_ activities: [Activity]?) -> Void) {
        Activity.collectionReference.getDocuments { (querySnapshot, error) in
            guard error == nil else {
                print("Error: \(error?.localizedDescription ?? "Generic error")")
                return
            }
            
            let activities = querySnapshot?.documents.compactMap({ (queryDocumentSnapshot) -> Activity? in
                
                return try! queryDocumentSnapshot.data(as: Activity.self)
            })
            
            completion(activities)
        }
    }
}

调用 Activity.getActivities 我可以获得我需要的一切,但直接从活动对象解码用户和运动,他们得到活动 ID 而不是他们自己的。这是错误的,因为这样我对对象的引用是错误的。这个想法是保留引用以在详细信息页面中使用它并获取完整的对象。有人能告诉我构建这种架构的最佳方式是什么吗?先感谢您。

标签: swiftfirebasegoogle-cloud-firestorecodabledecodable

解决方案


推荐阅读