Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 在Firestore.addDocument上使用Snapshotlistener,它将自己的ID添加到文档中_Swift_Google Cloud Firestore - Fatal编程技术网

Swift 在Firestore.addDocument上使用Snapshotlistener,它将自己的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

我正在使用此文件创建新文件,并将文件id添加到其中:

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,
    // ...
])
有关更多详细信息,请参阅