【发布时间】:2019-10-14 14:20:02
【问题描述】:
现有的解决方案对我不起作用,我已经尝试过了。我要做的是在存储在 Firestore 上的线程中获取消息。这是 Chat 集合的当前结构:
正如您所见,用户 1 和用户 2 之间的聊天只有 2 条消息,我正在尝试获取这些消息,并且如果将它们添加到线程中,还会收听新消息。这是我如何做的代码:
func loadChat() {
self.showWaitOverlayWithText("Loading")
let db = Firestore.firestore().collection("Chats")
.whereField("user1ID", isEqualTo: Auth.auth().currentUser?.uid ?? "Not Found User 1")
.whereField("user2UID", isEqualTo: user2UID ?? "Not Found User 2")
db.getDocuments { (querySnap, error) in
if let error = error {
print("Error: \(error)")
return
} else {
let doc = querySnap?.documents.first
doc?.reference.collection("thread").addSnapshotListener(includeMetadataChanges: true, listener: { (threadQuery, error) in
//Never comes here
for message in threadQuery!.documents {
self.removeAllOverlays()
print("Data: \(message.data())")
}
})
}
}
}
它从不执行collection("thread").addSnapshotListner。
【问题讨论】:
-
打印错误吗?也就是进入条件语句的第一个场景(
if let error = error {) -
不,它永远不会执行
addSnapShotListner部分 -
好的,所以问题是
let doc = querySnap?.documents.first正在返回nil。或者,类似地,querySnap等于nil。 -
发现了一个愚蠢的错误,键名是
User2ID而不是User2UID -
如果是这样,那么问题出在
let db = Firestore.firestore().collection("Chats").whereField("user1ID", isEqualTo: Auth.auth().currentUser?.uid ?? "Not Found User 1").whereField("user2UID", isEqualTo: user2UID ?? "Not Found User 2这一行。您能否检查一下Auth.auth().currentUser?.uid和user2UID以确保两者都不是nil并且它们是与您的数据库匹配的字符串?
标签: swift firebase google-cloud-firestore