Код продолжает выполняться, несмотря на то, что извлечение Firebase все еще не завершено - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь получить информацию из FireMase FireStore в XCode, поместить ее в список, а затем отобразить ее в CollectionView.

В моем FireStore у меня есть 2 коллекции, пользователи и места Коллекция пользователей: есть пользователь информация и коллекция идентификаторов мест, которые они посетили. Коллекция мест: содержит информацию о месте, включая идентификатор места

. Поэтому, если пользователь вошел в систему, я буду отображать его места в CollectionView, используя идентификаторы мест в коллекции пользователя для получения информации о мест из коллекции мест.

Итак, я сделал два вложенных запроса: один для получения идентификаторов мест у пользователя, второй - для сопоставления идентификаторов и получения информации из коллекции мест. Этот код работал, но он очень медленный, и код продолжает выполняться и завершается sh до получения всей информации, поэтому список остается пустым в CollectionView.

    db.collection("users").document(userID).collection("placesList").getDocuments(){ (querySnapshot, err) in
            if let err = err {
                print("Error getting documents: \(err)")
            } else {
                for userdocument in querySnapshot!.documents {
                    self.db.collection(“Places”).document(userdocument.documentID+"").getDocument(){ (document, error) in
                        if let document = document, document.exists {
                            let place = Place(ID: document.documentID, name: document.get("name") as! String, rate: document.get("rating") as! Double, long: document.get("longitude") as! Double, lat:document.get("latitude") as! Double)

                            self.list.append(place)

                        } else {
                            print("Document does not exist")
                        }//end else
                    }
                }//end second query
        }//end else
    }// end first query

Я не понимаю проблемы с этим кодом, есть ли лучший способ сделать это ?! Или как мне остановить выполнение кода перед завершением запросов?

1 Ответ

0 голосов
/ 23 марта 2020

Использование DispatchSemaphore

https://developer.apple.com/documentation/dispatch/dispatchsemaphore

больше объяснений здесь, https://medium.com/@roykronenfeld / semaphores-in-swift-e296ea80f860

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