Получить несколько идентификаторов документов Firestore - PullRequest
0 голосов
/ 22 апреля 2019

Как я могу получить документы на документы из магазина ?

Теперь я получаю несколько идентификаторов документов из бэкэнда , и мне нужно отобразить полученные идентификаторы документов в tableview .

В пожарном магазине У меня есть идентификаторы :

xNlguCptKllobZ9XD5m1 uKDbeWxn9llz52WbWj37 82s6W3so0RAKPZFzGyl6 EF6jhVgDr52MhOILAAwf FXtsMKOTvlVhJjVCBFj8 JtThFuT4qoK4TWJGtr3n TL1fOBgIlX5C7qcSShGu UkZq3Uul5etclKepRjJF aGzLEsEGjNA9nwc4VudD dZp0qITGVlYUCFw0dS8C n0zizZzw7WTLpXxcZNC6

И, например, мой бэкэнд нашел только этот идентификаторы :

JtThFuT4qoK4TWJGtr3n TL1fOBgIlX5C7qcSShGu UkZq3Uul5etclKepRjJF

или

aGzLEsEGjNA9nwc4VudD dZp0qITGVlYUCFw0dS8C n0zizZzw7WTLpXxcZNC6

Мне нужно отобразить только эти три идентификатора в tableview . (Но на самом деле бэкенд возвращает мне 100+ идентификаторов, а ниже вы можете увидеть безумную сортировку этих идентификаторов)

Backend добавить этот идентификатор во временный массив var tempIds: [String] = []

Так как мне получить из firestore только эти идентификаторы и отобразить их в tableview ?

Я использую этот код:

fileprivate func query(ids: String) {
    Firestore.firestore().collection(...).document(ids).getDocument{ (document, error) in
        if let doc = document, doc.exists {
            if let newModel = Halls(dictionary: doc.data()!, id: doc.documentID) {
                self.halls.append(newModel)
                self.halls.shuffle()
                self.halls.sort(by: { $0.priority > $1.priority })
                self.tableView.reloadData()
            } else {
                fatalError("Fatal error")
            }
        } else {
            return
        }
    }
}

Мне нужно обрабатывать идентификаторы из бэкэнда в фоновом режиме, а после обработки необходимо отображать обработанные идентификаторы в таблице без неистовой сортировки.

Может понадобиться использовать addSnapshotListened, но я не понимаю, как.

ОБНОВЛЕННЫЙ КОД:

for id in idsList {
                            dispatchGroup.enter()
                            Firestore.firestore().collection(...).document(id).getDocument{ (document, error) in
                                if let doc = document, doc.exists {
                                    if let newHallModel = Halls(dictionary: doc.data()!, id: doc.documentID) {
                                        self.tempHalls.append(newHallModel)
                                        dispatchGroup.leave()
                                    } else {
                                        fatalError("Fatal error")
                                    }
                                } else {
                                    print("Document does not exist")
                                    MBProgressHUD.hide(for: self.view, animated: true)
                                    return
                                }
                            }
                        }

                        dispatchGroup.notify(queue: .global(qos: .default), execute: {

                            self.halls = self.tempHalls

                            DispatchQueue.main.async {
                                MBProgressHUD.hide(for: self.view, animated: true)
                                self.tableView.reloadData()
                            }
                        })

enter image description here

1 Ответ

1 голос
/ 22 апреля 2019

Получение документа по его идентификатору должно быть зарезервировано для моментов, когда вам нужен один документ (или несколько маленьких). Если вам нужно получить несколько документов, вы должны создать запрос. Помните, что хранилище является самым дешевым компонентом вашей базы данных NoSQL, поэтому, чтобы в полной мере использовать денормализацию **** из ваших данных, что в терминах Firestore означает создание столько сборов, сколько необходимо для удовлетворения всех ваших запросов (чтобы вы могли возвращает наименьшее количество возможных документов на запрос), даже если эти коллекции хранят данные, которые уже существуют в других документах, в других коллекциях. Физическое хранение ваших данных в Firestore должно составлять копейки на доллар по сравнению с другими вашими расходами.

Поэтому на вашем месте я бы либо добавил в эти документы поле, к которому вы можете запросить запрос, либо создал бы новую коллекцию, в которой хранятся только те поля, которые нужны для этого запроса (с полем, к которому вы можете обращаться). Однако, если это невозможно, и вы все еще хотите получать несколько документов по идентификатору, тогда вам нужно сделать n отдельных запросов get-document и использовать группу диспетчеризации для обработки их асинхронных возвратов:

let docIds = ["JtThFuT4qoK4TWJGtr3n", "TL1fOBgIlX5C7qcSShGu", "UkZq3Uul5etclKepRjJF"]

let dispatchGroup = DispatchGroup()
dispatchGroup.enter()

for id in docIds {

    Firestore.firestore().collection(...).document(id).getDocument{ (document, error) in

        // append to array
        dispatchGroup.leave()

    }

}

dispatchGroup.notify(queue: .global(qos: .default), execute: {

    // hand off to another array if this table is ever refreshed on the fly

    DispatchQueue.main.async {
        // reload table
    }

})
...