我在应用程序中使用了几个 Firestore 侦听器,我想知道在这些侦听器闭包中解码 Cloud Firestore 文档的首选方法是什么?使用 .data(as:)、Firestore.Decoder().decode() 还是 querySnapshot.documents.compactMap 更好?我已经成功地使用了这三种方法,但我想了解更多有关何时使用哪种方法最好的信息。每个示例如下:
let document = try documentSnapshot.data(as: SummaryDocument.self)
let documentData = documentSnapshot.data()
let decodedDocument = try Firestore.Decoder().decode(SummaryDocument.self, from: documentData!)
let documents = querySnapshot.documents.compactMap { document in
try? document.data(as: SummaryDocument.self)
}
从我读过的大部分内容来看,如果您要处理单个文档并且需要对数据进行更多控制,则 .data(as: 或 Firestore.Decoder() 似乎更有用。它似乎也建议使用 .data(as: 作为大多数情况下的首选方法,因为它使用更简单,处理文档 ID,并且可能更高效。但是,在多个文档的情况下,.compactMap 似乎是推荐的方法。
是这样吗?任何人都可以确认这一点并提供更多指导吗?
将文档从 Cloud Firestore 映射到 Swift 结构时,您通常应该使用 Codable 协议 - 它允许您仅使用一行代码来映射文档,而不必为每个属性单独编写映射代码。
要映射单个文档,请使用
try document.data(as: YourType.self)
。
映射多个文档(例如查询的结果)时,您仍将使用
try document.data(as: YourType.self)
,但在循环中迭代查询结果集中的所有文档。一种优雅的方法是使用 compactMap
,因为它会自动删除 nil
值(这可能是尝试从文档映射到没有匹配字段的结构的结果)。
文档中的此页面包含更多详细信息并提供大量示例:
https://firebase.google.com/docs/firestore/solutions/swift-codable-data-mapping