iOS Firebase如何获取集合内的多个对象?

时间:2018-12-05 15:27:53

标签: ios swift firebase

我的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)的正确方法?

1 个答案:

答案 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会迅速指出,通常不建议在紧密循环中读取此类数据。最好在要阅读的帖子之间具有其他关联,然后执行查询以将其读入。