Как сделать несколько асинхронных загрузок в хранилище 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)
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

0 ответов

Другие вопросы по тегам