Загрузка файла из хранилища последовательно — Быстро — программно

#swift #asynchronous #google-cloud-firestore #firebase-storage

#swift #асинхронный #google-облако-firestore #firebase-хранилище

Вопрос:

У меня есть массив пользовательских изображений:

Я загружаю его в хранилище Firebase и для каждого изображения загружаю его URL: затем я добавляю его в массив, подобный этому:

 var imageUrlStringArray = [String]()
                    
                    //imagesArray is ORDINATED correctly
for i in 0...imagesArray.count-1{
                        
let imageID = "(UUID().uuidString).jpg"
guard let imageData = imagesArray[i].jpegData(compressionQuality: 0.4) else { return }
                        
storageThumbnailsRef.child(imageID).putData(imageData, metadata: nil) { (metadata, err) in
if let err = err{
                                print("impossible to add a thumbnail image: (err.localizedDescription)")
                                return
                            }
                            
storageThumbnailsRef.child(imageID).downloadURL { (url, err) in
                                if let err = err{
                                    print("impossible to download image: (err.localizedDescription)")
                                    return
                                }
                                
                    imageUrlStringArray.append(url!.absoluteString)
                            }
                        }
                    }
   firestorePosts.addDocument(data: ["arrayImages": imageUrlStringArray])
  

Начальный массив упорядочен правильно, как я хочу, другой массив не упорядочен как первый. imagesArray imageUrlStringArray

Я знаю, что это связано с тем, что функция downloadURL является асинхронной, и поэтому, как только загружается ImageUrl, он добавляется в массив.

Но как я могу по-прежнему imageUrlStringArray упорядочивать как imagesArray

Ответ №1:

Вы можете использовать словарь вместо массива, используя индекс for цикла, чтобы сохранить порядок строк URL-адреса изображения:

 var imageUrlStringArray = [Int: String]()
  

Затем измените:

 imageUrlStringArray.append(url!.absoluteString)
  

к следующему, используя imagesArray индекс в качестве ключа:

 imageUrlStringArray.updateValue(url!.absoluteString, forKey: i)
  

Наконец, когда все запросы заканчиваются, вы можете преобразовать словарь обратно в массив, используя простой map вызов, после сортировки массива по индексу:

 let orderedImageUrlStringArray = imageUrlStringArray.sorted(by: { $0.key < $1.key }).map(.value)