#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)