Swift 在Firestore.addDocument上使用Snapshotlistener,它将自己的ID添加到文档中
我正在使用此文件创建新文件,并将文件id添加到其中:Swift 在Firestore.addDocument上使用Snapshotlistener,它将自己的ID添加到文档中,swift,google-cloud-firestore,Swift,Google Cloud Firestore,我正在使用此文件创建新文件,并将文件id添加到其中: func createGroup(userUid: String, groupName: String, onSuccess: @escaping () -> Void, onError: @escaping () -> Void) { let db = Firestore.firestore() let dic = ["groupName": groupName, "use
func createGroup(userUid: String, groupName: String, onSuccess: @escaping () -> Void, onError: @escaping () -> Void) {
let db = Firestore.firestore()
let dic = ["groupName": groupName, "userUid": userUid, "timeStamp": timeStamp] as [String : Any]
var ref: DocumentReference? = nil
ref = db.collection("groups").addDocument(data: dic) { (error) in
if error != nil {
onError()
} else {
let docId = ref!.documentID
print("data setted")
ref?.setData(["groupId": docId], merge: true)
onSuccess()
}
}
}
现在我有了这样一个Snapshotlistener,可以将创建的数据添加到表视图中:
func getGroupsForAUser(userUid: String, onSuccess: @escaping (GroupsModel) -> Void, onError: @escaping () -> Void, onEmpty: @escaping () -> Void) {
let db = Firestore.firestore()
db.collection("groups").whereField("userUid", isEqualTo: userUid).order(by: "timeStamp", descending: true).addSnapshotListener({ (snapshot, err) in
if err != nil {
onError()
} else {
snapshot?.documentChanges.forEach { (diff) in
if (diff.type == .added) {
let dic = diff.document.data()
print(GroupsModel(dictionary: dic).groupId)
print(GroupsModel(dictionary: dic).groupName)
let group = GroupsModel(dictionary: dic)
onSuccess(group)
}
}
}
})
}
问题是:snapshotlistener在“ref?.setData(…)”之前触发,而我丢失了有关新创建数据的一些重要信息
如何修改snapshotlistener,使其在“setData”之后触发,而不是在我的“addDocument”事件中触发?在设置客户端数据之前,您可以通过不带参数的调用获取客户端上生成的新文档的随机ID:
let ref = db.collection("groups").document()
let id = ref.documentID
您现在有一个对尚不存在的文档的引用,但您知道它的ID。您可以在创建文档时使用它将ID添加到文档中:
ref.setData([
"groupId": id,
// ...
])
有关更多详细信息,请参阅