IOS Firebase, как получить несколько объектов внутри коллекции? - PullRequest
0 голосов
/ 05 декабря 2018

У меня была проблема с firebase, у меня 5 идентификаторов документов.Мне нужно запросить эти 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) Я понятия не имею, как сделать это правильно.

Как правильно выбрать несколько документов (с указанным идентификатором) ???

1 Ответ

0 голосов
/ 05 декабря 2018

В этом вопросе есть немного постороннего кода, поэтому он не совсем понятен, но кажется, что вы хотите перебрать массив ключей документа, прочитать каждый связанный документ и добавить свойства в массив (или в вашем случае создать объект на основена эти свойства и добавьте его)

Вот простой пример, читающий серию постов и добавляющий текст поста к каждому посту в массиве.

Структура:

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 быстро укажет, что чтение таких данных в тесном цикле обычно не рекомендуется.Было бы лучше иметь некоторую другую корреляцию между сообщениями, которые вы хотите прочитать, а затем выполнить запрос, чтобы прочитать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...