swift - 在 FirebaseFirestoreSwift 中处理 documentID 真的很令人困惑
问题描述
我必须查询大量集合,并且模型总是这样定义:
struct Order : Identifiable, Codable {
@DocumentID var id : String?
let fieldOne : String?
let fieldTwo : Int?
enum CodingKeys : String, CodingKey {
case id // (had to comment this out)
case fieldOne
case fieldTwo
}
}
今天,我花了一整天的时间试图弄清楚为什么我不能从一个特定的集合中加载文档。我正在获取包含文档的快照,但无法将它们转换并填充到数组中。经过数小时的反复试验,我在枚举中注释掉了“case id”并让它工作。
知道为什么会这样吗?
这是一个适用于案例 ID 的查询:
listener = db.collection("Meal_Plans").whereField("userId", isEqualTo: userEmail).order(by: "timeOfCreation", descending: true).addSnapshotListener({ (querySnapshot, error) in
if let error = error {
print("error in mp query: \(error.localizedDescription)")
} else {
guard let documents = querySnapshot?.documents else {
print("No mealplans")
return
}
let mealplanArray: [Mealplan] = documents.compactMap { queryDocumentSnapshot -> Mealplan? in
return try? queryDocumentSnapshot.data(as: Mealplan.self)
}
let planViewModel = mealplanArray.map({return PlanViewModel(mealplan: $0)})
DispatchQueue.main.async {
if mealplanArray.count > 0 {
self.planViewModelDelegate?.plansFetched(self.updateHour(sourcePlans: planViewModel))
}
}
}
})
这是一个没有:
listener = db.collection("Placed_Orders").whereField("userId", isEqualTo: userId).whereField("status", isLessThan: 410).order(by: "status", descending: false).order(by: "nextOrderDate", descending: false).addSnapshotListener({ (documentSnapshot, error) in
if let error = error {
print("error")
self.orderCallback?(error.localizedDescription, nil, .error)
} else {
print("empty")
guard let documents = documentSnapshot?.documents else {
return }
if documents.isEmpty {
self.orderCallback?("No orders found", nil, .error)
return
} else {
print("snapshot count: \(documents.count)")
let orderArray: [Order] = documents.compactMap { queryDocumentSnapshot -> Order? in
return try? queryDocumentSnapshot.data(as: Order.self)
}
let orderViewModel = orderArray.map({ return OrderViewModel(order: $0)})
print("array count: \(orderArray.count)")
DispatchQueue.main.async {
print("status: \(orderViewModel)")
self.orderCallback?(nil, orderViewModel, .success)
}
}
}
})
差异相当微妙。在这两种情况下,我都使用快照侦听器来查询快照并将其填充到数组中,然后将该数组映射到视图模型中。
然而,在后一种情况下,我必须注释掉可识别字段的案例 ID。我需要 ID,所以需要查看它是否有效,但想知道为什么我必须注释掉案例 ID。
解决方案
推荐阅读
- javascript - jQuery 在除当前之外的 h 元素后折叠 ul
- arrays - 打印散列的 Perl 散列
- r - 表重组拆分 R
- perl - 在 Perl 中访问哈希值
- macos - iTerm MAC os 中的 ctrl+shift+x 终结符替代方案?
- python - 为什么 dir("an import module") 中没有 __dict__ 作为属性?
- php - TYPO3 后端编辑器的错误消息
- java - 是否有一种模式可以根据 Java 中先前的结果执行一系列方法?
- spring - 如何使用 java 配置在 Spring Integration 中使用 FileSplitter (@Splitter) 拆分文件
- laravel - Laravel:从 2 个不同的域访问网站,其中一个通过 https,另一个通过 http