Swift — Почему моя функция запускает все внешние циклы перед запуском внутренних циклов при попытке запроса Firebase Firestore?

#swift #for-loop #google-cloud-firestore

#swift #для цикла #google-cloud-firestore

Вопрос:

Ниже приведен раздел запроса, который я пытаюсь выполнить в Swift.
Чего я не могу понять, так это почему :

   room = Room(images: images, name: name)
  rooms.append(room)
  

выполняется до:

                               imageQuery.getDocuments()
                               {
                                (QuerySnapshot, err) in
                                    if let err = err{}
                                    else
                                    {
                                        for document in QuerySnapshot!.documents
                                        {
                                            let imageURL = document.data()["imageURL"] as? String ?? ""
                                            let image = ImageModel(imageURL: imageURL, date: Date(timeIntervalSinceNow: 0))
                                            images.append(image)
                                        }
  

Второй фрагмент кода выполняется, но он выполняется после первого фрагмента. Но мне нужны значения из второго, чтобы заполнить значения в первом. Я не новичок в программировании, но я новичок в swift, и, похоже, я не могу понять, как заставить внешний цикл перейти во внутренний цикл перед запуском остальной части его кода. Спасибо за вашу помощь!

Вот большая часть функции:

  let roomQuery = projectRef.document(document.documentID).collection("Rooms")
                                        roomQuery.getDocuments()
                    {
                        (QuerySnapshot, err) in
                        if let err = err{}
                        else
                        {
                            var room:Room
                           
                            for document in QuerySnapshot!.documents
                            {
                                let name = document.data()["name"] as? String ?? ""
                                var images = [ImageModel]()
                                let imageQuery = roomQuery.document(document.documentID).collection("Images")
                               
                                imageQuery.getDocuments()
                               {
                                (QuerySnapshot, err) in
                                    if let err = err{}
                                    else
                                    {
                                        for document in QuerySnapshot!.documents
                                        {
                                            let imageURL = document.data()["imageURL"] as? String ?? ""
                                            let image = ImageModel(imageURL: imageURL, date: Date(timeIntervalSinceNow: 0))
                                            images.append(image)
                                        }
                                    }
                               }
                                room = Room(images: images, name: name)
                                rooms.append(room)
                            }
                        }
  

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

1. programmingios.net/what-asynchronous-means

Ответ №1:

поскольку вы используете замыкание, а не цикл, поэтому оно выполняется асинхронно