Как сделать несколько асинхронных загрузок в хранилище Firebase?
У меня есть массив данных, которые я хочу загрузить в хранилище Firebase по порядку, поэтому URL-адреса загрузки, которые извлекаются, тоже в порядке.
Я пытался использовать DispatchGroup и DispatchSemaphore для этого, но я предполагаю, что вставил их в неправильные позиции в своем коде, потому что мой оператор печати, который печатает индекс и urlString, печатается не по порядку. Как я могу это исправить?
import Foundation
import FirebaseStorage
func uploadToStorage(dataArray: [Data],
completion: @escaping (_ success: Bool, _ urlsAsStringArray: [String]) -> Void) {
let dispatchGroup = DispatchGroup()
let dispatchSemaphore = DispatchSemaphore(value: 0)
let dispatchQueue = DispatchQueue(label: "someTask")
var urlsAsStringArray: [String] = []
dispatchQueue.async {
for (index, data) in dataArray.enumerated() {
dispatchGroup.enter()
dispatchSemaphore.signal()
let imageId = NSUUID().uuidString
let fileName = "\(imageId).jpg"
let folder = Storage.storage().reference()
.child("photos")
folder.child(fileName).putData(data, metadata: nil) { (metadata, error) in
if let error = error {
print("\n \nError with Firebase Storage photo upload:")
print(error)
dispatchGroup.leave()
dispatchSemaphore.wait()
completion(false, [])
} else {
print("\n \nSuccess with Firebase Storage photo upload")
folder.child(fileName).downloadURL { (url, error) in
if let error = error {
print("\n \nError with retrieving Firebase Storage photo download URL:")
print(error)
dispatchGroup.leave()
dispatchSemaphore.wait()
completion(false, [])
} else {
if let urlAsString = url?.absoluteString {
print("\n \nSuccess with retrieving Firebase Storage photo download URL")
print("\n \nPhoto message to be sent to Firebase Firestore has URL link: \(urlAsString)")
urlsAsStringArray.append(urlAsString)
print("Index is: \(index). Photo uploaded has url: \(urlAsString)")
dispatchGroup.leave()
dispatchSemaphore.wait()
if index == dataArray.count - 1 {
completion(true, urlsAsStringArray)
}
}
}
}
}
}
}
}
}