Firestore создает экземпляры объектов с помощью data recover Swift 5.0

#arrays #swift #firebase #google-cloud-firestore #instantiation

# #массивы #swift #firebase #google-облако-firestore #создание экземпляра

Вопрос:

Я получаю все данные из своего моментального снимка и создаю список объектов с этими данными. Моя проблема: я не могу вернуть список для использования моих объектов в других функциях кода.

Я попытался просмотреть свой список, чтобы создать с помощью моего моментального снимка новый список объектов, объявленных выше в моем коде.

 class ViewController: UIViewController {

lazy var usersCollection = Firestore.firestore().collection("ship")
var ships: [MyShip] = []

override func viewDidLoad() {
    super.viewDidLoad()

    getUsers()
   print(ships.count)


}
 

Функция getData:

  func getUsers() {
    usersCollection.getDocuments { (snapshot, _) in

       //let documents = snapshot!.documents
       //  try! documents.forEach { document in

       //let myUser: MyUser = try document.decoded()
       //print(myUser)
        //}

        let myShip: [MyShip] = try! snapshot!.decoded()

        // myShip.forEach({print($0)})


        for elt in myShip {
           print(elt)
            self.ships.append(elt)
        }
        print(self.ships[1].nlloyds)
    }
}
 

консоль результатов

Результат в консоли:

 - my list is not filled return 0
- I print the objects well and I print them well
- I print the ships object[1].nloyds = 555 well in the function 
 

Ответ №1:

Ваш print(ships.count) вызов viewDidLoad печатает пустой массив, потому .getDocuments() что метод является асинхронным. Попробуйте написать getUsers как закрытие, подобное этому:

 func getUsers(completion: @escaping ([MyShip]) -> Void) {
    usersCollection.getDocuments { (snapshot, _) in
        let myShip: [MyShip] = try! snapshot!.decoded()
        completion(myShip)
    }
}
 

а затем используйте его в viewDidLoad методе, подобном этому:

 override func viewDidLoad() {
    super.viewDidLoad()

    getUsers() { shipsFound in
        self.ships = shipsFound
        print(self.ships.count)
    }

}
 

Комментарии:

1. Я благодарю вас, что ваше решение работает для отображения кораблей. но мне бы хотелось немного манипулировать ими, как я делаю в своем ListView пример на картинках: ( imgur.com/a/iPfowPq ) , если у вас есть сайты с примерами кодов, чтобы узнать, как использовать Firestore, мне очень интересно! 🙂

2. Вы все равно должны иметь возможность манипулировать данными, вам просто нужно сначала убедиться, что они у вас есть. Поместите self.tableView.reloadData() внутри закрытия после self.ships = shipsFound того, как TableView загрузит результаты метода закрытия. Кроме того, если мой первоначальный ответ решил ваш первоначальный вопрос, не могли бы вы принять его как правильный ответ?

3. Кроме того, я только что прочитал документацию Firebase, она очень подробная, вы должны проверить ее, если вы еще этого не сделали! firebase.google.com/docs/database/ios/read-and-write

4. спасибо всем вам, я подтвердил ваш ответ!