Swift Firestore 来自查询的自定义对象,同时使用 snapshotListener 监听实时更新
Posted
技术标签:
【中文标题】Swift Firestore 来自查询的自定义对象,同时使用 snapshotListener 监听实时更新【英文标题】:Swift Firestore custom objects from query while listening for realtime updates with snapshotListener 【发布时间】:2020-05-03 08:53:31 【问题描述】:我在将 querySnapshots
转换为自定义对象时遇到问题,观察到 snapshotListener
的更改。
这是我的代码,但编译器在抱怨:
func getCartData(db: Firestore)
db.collection("test")
.whereField("Cart", arrayContains: "testItem")
.addSnapshotListener querySnapshot, error in
guard let documents = querySnapshot?.documents else
print("Error fetching document: \(error!)")
return
for doc in documents
guard let data = doc.data() else //here is an error saying: Initializer for conditional binding must have Optional type, not '[String : Any]'
print("Document data was empty.")
return
let result = Result
try doc.data(as: CartDataDocument.self)
switch result
case .success(let userDataDoc):
if let userDataDoc = userDataDoc
// A `userDataDoc` value was successfully initialized from the DocumentSnapshot.
self.cartData = userDataDoc
else
// A nil value was successfully initialized from the DocumentSnapshot,
// or the DocumentSnapshot was nil.
print("Document does not exist")
case .failure(let error):
// A `userDataDoc` value could not be initialized from the DocumentSnapshot.
print("Error decoding UserDataDocument: \(error)")
我能够为一个使用snapshotListener
收听的 Firestore 文档制作自定义对象,但这个查询没有运气。
【问题讨论】:
【参考方案1】:错误似乎正确。如果您查看 Xcode 在自动完成时显示的声明,doc.data()
确实是不可为空的 [String: Any]
。
如果你想检查一个文档是否为空,你可以这样做:
guard !doc.data().isEmpty else
print("Document data was empty.")
return
否则,您也可以在CartDataDocument
中override init(from decoder: Decoder) throws
并为所有键提供默认值。 这显然是朝着不同的方向发展:不是忽略空文档,而是将它们添加到具有默认值的列表中。但我不得不问:为什么你有空文件?
【讨论】:
非常感谢您的回答。我没有空文档,也不打算制作空文档对象(如果有的话)。 会不会是 Xcode 抱怨,因为guard let documents = querySnapshot?.documents else print("Error fetching document: \(error!)") return
可能是一个空的 querySnapshot,因此 documents
也可能是空的?
如果您没有可能存在空文档的情况,那么我将删除此检查。无论如何,documents
属性在 Objective-C 中被显式标记为non-null
,所以guard let documents = querySnapshot?.documents
将只打开querySnapshot
。
很高兴知道这是如何在 Objective-C 中完成的。非常感谢!
不客气!如果这回答了您的问题,请务必将其标记为已批准的答案。以上是关于Swift Firestore 来自查询的自定义对象,同时使用 snapshotListener 监听实时更新的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中重构重复的 Firestore 文档 ID?
如何将默认反应上下文值设置为来自 Firestore 的数据?