使用Swift和Firestore解码嵌套对象

问题描述

我正在使用Swift 5和Firestore开发一个应用程序。 我创建了结构Identifiables和Codables,效果很好,但是在解码嵌套文档的DocumentID时遇到问题。 我无法在网上找到类似的内容。 我想知道我实现的Firestore结构在我的用例中是否正确以及如何解决id问题。

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

在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,而不是他们自己的ID。这是错误的,因为这样我对对象的引用有误。想法是保留引用以在详细信息页面中使用它并获取完整的对象。 谁能告诉我构造这种架构的最佳方法是什么? 预先谢谢你。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)