swift - 使用 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 而不是他们自己的。这是错误的,因为这样我对对象的引用是错误的。这个想法是保留引用以在详细信息页面中使用它并获取完整的对象。有人能告诉我构建这种架构的最佳方式是什么吗?先感谢您。
解决方案
推荐阅读
- python - 如何确定变量的优先级(Python)
- javascript - sinon 存根无法识别对存根的调用
- sql - 如何将所有子组折叠成一行并保持相同的顺序
- c# - 从 SELECT 语句生成/返回空数据时,如何导致 U-SQL 脚本失败?
- docker - microsoft .net core 2.2 sdk docker 容器能否用于构建 2.1 和 2.2 目标项目
- html - 如何将对象数组绑定到 ionic 4 中的视图?
- python - 在特定 div 的 span 类中获取文本
- sql - 铅和分区功能
- jms - 接收方未读取 MQ 消息上的 ApplIdentity 数据集
- python - 使用 Xbee 和 Rapberry 的面包屑网络