我的firebase有问题,我有5个文档ID。我需要查询这5个文档,将它们转换为对象。
for oneID in allIDs {
self.db.collection("storecollection").document(oneID).getDocument {(snap,err) in
let oneobject = convertToObject(snap)
self.tempHolder.append(oneobject)
var newarray = [MyObjectClass]()
if allIDs.last == oneID {
// perform copy
for x in 0...(self.tempHolder.count -1){
newarray.append(self.tempHolder[x])
}
self.tempHolder.removeAll()
completion(newarray)
}
}
上面的代码出了点问题,self.tempHolder的大小总是计数=1。(仅存在最后一个id提取的对象)我不知道如何正确设置。
什么是获取多个文档(具有指定ID)的正确方法?
答案 0 :(得分:0)
该问题中有一些无关的代码,因此尚不十分清楚,但是您似乎想要遍历文档键的数组,读取每个关联的文档并将属性添加到数组中(或者在您的情况下,基于对象创建对象在这些属性上并将其添加)
这是一个简单的示例,其中读取了一系列帖子,并将每个帖子的帖子文本附加到数组中。
结构是
posts //a collection
post_0
post_text: "A post"
post_1
post_text: "Another post"
post_2
post_text: "Cool post"
以及要在post_0和post_2中读取并将代码文本附加到数组的代码
var postTextArray = [String]()
func readMultiplePosts() {
let postKeyArray = ["post_0", "post_2"]
for postKey in postKeyArray {
let docRef = self.db.collection("posts").document(postKey)
docRef.addSnapshotListener { documentSnapshot, error in
guard let document = documentSnapshot else {
print("err fetchibng document")
return
}
guard let data = document.data() else {
print("doc was empty")
return
}
print("doc data: \(data)")
let post = document.get("post_text") as! String
self.postMsgArray.append(post)
}
}
}
然后稍后我们要打印帖子文本
for p in self.postMsgArray {
print(p)
}
和控制台的输出
A post
Cool post
尽管此解决方案有效,但Firebaser会迅速指出,通常不建议在紧密循环中读取此类数据。最好在要阅读的帖子之间具有其他关联,然后执行查询以将其读入。