Swift 从未调用addDocument完成处理程序

Swift 从未调用addDocument完成处理程序,swift,firebase,google-cloud-firestore,Swift,Firebase,Google Cloud Firestore,我有一个在firebase中将文档添加到集合的功能。它是使用for循环完成的。我有一个DispatchGroup,在循环的每次迭代开始时调用enter()。添加每个文档后,我想调用addDocument方法的完成处理程序。在完成处理程序中,我想对DispatchGroup调用leave(),以便在添加所有文档后最终可以执行一个segue。我的问题是,完成处理程序似乎从未被调用,因为消息从未被打印。每次运行代码时,我都可以看到这些文档被添加到我在firebase中的集合中。我是否误解了什么,或者我

我有一个在firebase中将文档添加到集合的功能。它是使用for循环完成的。我有一个DispatchGroup,在循环的每次迭代开始时调用enter()。添加每个文档后,我想调用addDocument方法的完成处理程序。在完成处理程序中,我想对DispatchGroup调用leave(),以便在添加所有文档后最终可以执行一个segue。我的问题是,完成处理程序似乎从未被调用,因为消息从未被打印。每次运行代码时,我都可以看到这些文档被添加到我在firebase中的集合中。我是否误解了什么,或者我的方法有什么问题?任何帮助都将不胜感激。我的代码的简化示例如下所示:

func uploadDocumentToFirebase(names: String[])
    {   
        for name in names
        {
            dispatchGroup.enter()

            collection.addDocument(data: ["name": name], completion: {error in

                print("Document: \(name) was uploaded to firebase")

                self.dispatchGroup.leave()
            })
        }
    }

我要添加的实际文档有6个字段,而不是我的示例中显示的1个字段,如果这有任何区别的话。

编辑:

也许您可以运行一个完成处理程序,以便您的出口与您的组位于同一位置?我通常在这种情况下编写完成处理程序,并在有
self.dispatchGroup.leave()的地方调用它们。您可以将
self.dispatchGroup.leave()
放在完成块中,这会有帮助吗?看起来你的团队的入口点和出口点数量参差不齐。使用完成块进行组织可能有助于找到它

completion: (@escaping (Bool) -> ()) = { (arg) in })
原件:

你介意用这个setData代码而不是adddcument来看看它是否有用吗?您可以将您的调度添加到此代码中,然后查看是否所有操作都有效。如果不是的话,我会一直想下去

还可以检查以确保输入数组不是空的(只需将其打印到方法中的控制台)


有很多方法可以做到这一点——这里有两种。第一种是使用调度组,第二种是使用和索引技术

我有一个单词数组,希望将它们写入Firestore,在每个单词被写入时发出通知,然后在它们全部被写入时发出通知

let arrayOfWords = ["boundless", "delicious", "use", "two", "describe", "hilarious"]
这是调度组代码。我们进入组,写入数据,然后在完成处理程序中,完成后离开。全部离开后,将调用group.notify

func writeWordUsingDispatchGroup() {
    let group = DispatchGroup()
    let wordCollection = self.db.collection("word_collection")

    for word in self.arrayOfWords {
        group.enter()
        let dataToWrite = ["word": word]
        wordCollection.addDocument(data: dataToWrite, completion: { error in
            print("\(word) written")
            group.leave()
        })
    }

    group.notify(queue: .main) {
        print("all words written")
    }
}
然后是索引代码。所有这些都是计算数组中最后一个对象的索引,然后在枚举的数组上迭代(这样我们就得到了索引)。当当前循环的索引与最后一个索引匹配时,我们就知道我们完成了

func writeWordsUsingIndex() {
    let wordCollection = self.db.collection("word_collection")
    let lastIndex = self.arrayOfWords.count - 1
    for (index, word) in self.arrayOfWords.enumerated() {
        let dataToWrite = ["word": word]
        wordCollection.addDocument(data: dataToWrite, completion: { error in
            print("\(word) written")

            if index == lastIndex {
                print("all words written")
            }
        })
    }
}
我的问题是,完成处理程序似乎从未被称为 这些信息永远不会被打印出来


您似乎没有在
addDocument
方法中调用
completion
,至少在成功添加文档的情况下是这样。

感谢您的响应!不幸的是,这段代码似乎和我自己的代码有同样的问题。据我所知,它们在功能上是一样的。我知道输入列表不是空的,因为我已经尝试打印出了整个内容。有趣的是,我运行这段代码(仅对数据进行了更改)时没有出现任何问题。你确定你的GoogleService-Info.plist是正确的,并且你在应用程序代理中配置了firebase吗?您是否能够向firestore添加任何数据?如果根本不调用dispatch,代码是否有效?每次我运行代码时,都会添加文档。我还可以检索收藏中的每个文档。我应该澄清一下,我在向我的收藏添加数据或从中检索数据方面没有任何问题。我希望在调用完成处理程序时能够执行特定的操作,而这似乎从来都不是。我将编辑我的问题以反映这一点。哦!我不明白!我以为你的问题是文档无法上传,所以你的代码永远不会存在。我将用一些新的想法修改我的答案。我测试了你的建议,但不幸的是,它不起作用。我不认为问题出在我的退出点和进入点上,因为我试图删除对enter()和leave()的任何调用。完成块中的代码仍然没有执行。谢谢你的努力!这段代码非常接近。只需使用
group.notify(queue:.main)
添加有关调度组已完全调度时要执行的操作的代码。请看我的答案,一个更简单的选择。我已经尝试了你的建议,但不幸的是,它不起作用。我了解DispatchGroup的工作原理,调用
notifiy()
不是我的问题所在。我的问题与firestore collections方法
addDocument()
的完成处理程序没有被调用有关。谢谢你花时间来帮助我。我的答案中的代码是有效的-两个例子,所以它应该适用于你的案例。您是否声明未调用完成处理程序?调用它时是否有错误?我在签出时留下了错误(在您的代码中也是如此),因此您可能希望检查,由于某种原因,当我尝试运行xcode时,它似乎正在安装我的项目的旧版本,这一定是为什么没有调用完成处理程序代码的原因,因为它根本不存在于该版本中。我已经试过你的建议了,看起来很管用。谢谢你的帮助。
func writeWordsUsingIndex() {
    let wordCollection = self.db.collection("word_collection")
    let lastIndex = self.arrayOfWords.count - 1
    for (index, word) in self.arrayOfWords.enumerated() {
        let dataToWrite = ["word": word]
        wordCollection.addDocument(data: dataToWrite, completion: { error in
            print("\(word) written")

            if index == lastIndex {
                print("all words written")
            }
        })
    }
}