Загрузка нескольких изображений одновременно с помощью Google Firebase

Я использую Google Firebase в проекте Swift для iOS. У меня есть часть моего приложения, где пользователь выбирает для загрузки более 1 фотографии со своего устройства. Я пытаюсь найти лучшую практику для загрузки всех фотографий, которые они выбрали сразу, в Firebase Storage. Я знаю, как загрузить одну фотографию.

Я просмотрел Документы и не увидел никаких методов загрузки нескольких объектов NSData, так что я бы просто запустил цикл for и загрузил каждое изображение отдельно?

Спасибо! Все отзывы приветствуются.

 Frank van Puffelen12 июн. 2016 г., 02:55
Вы бы просто зациклились и загрузили их по отдельности. Ваш пользователь iOS может также оценить, загружаете ли вы их по одному, чтобы они могли прервать загрузку на полпути, не теряя прогресса на всех изображениях.
 user4477618 авг. 2017 г., 07:44
@FrankvanPuffelen, не могли бы вы предоставить пример кода, как это делается? Должны ли мы реализовать сторонние библиотеки, такие как promiseKit, чтобы добиться этого?github.com/mxcl/PromiseKit

Ответы на вопрос(2)

Решение Вопроса

Ответ @FrankVanPuffellen в комментариях ...

«Вы действительно просто зациклите и загрузите их по отдельности. Ваш пользователь iOS также может оценить, загружаете ли вы их по одному, чтобы они могли прервать загрузку на полпути, не теряя прогресса на всех изображениях». - Фрэнк ван Пуффелен

Свифт 3 Вот как я загружаю несколько изображений в Firebase. Я делаю количество успешных загрузок, если оно равно количеству предоставленных изображений, то есть, когда я вызываю обработчик завершения.

Не уверен, что это лучшая практика, но она работает !!

import Foundation
import Firebase
import FirebaseDatabase
import FirebaseStorage

class UploadImages: NSObject{

static func saveImages(imagesArray : [UiImage]){

        Auth.auth().signInAnonymously() { (user, error) in
            //let isAnonymous = user!.isAnonymous  // true
            //let uid = user!.uid
            if error != nil{
                print(error)
                return
            }
            guard let uid = user?.uid else{
                return
            }

            uploadImages(userId: uid,imagesArray : imagesArray){ (uploadedImageUrlsArray) in
                print("uploadedImageUrlsArray: \(uploadedImageUrlsArray)")
            }
        }
    }


static func uploadImages(userId: String, imagesArray : [UIImage], completionHandler: @escaping ([String]) -> ()){
    var storage     =   Storage.storage()

    var uploadedImageUrlsArray = [String]()
    var uploadCount = 0
    let imagesCount = imagesArray.count

    for image in imagesArray{

        let imageName = NSUUID().uuidString // Unique string to reference image

        //Create storage reference for image
        let storageRef = storage.reference().child("\(userId)").child("\(imageName).png")


        guard let myImage = image else{
            return
        }
        guard let uplodaData = UIImagePNGRepresentation(myImage) else{
            return
        }

        // Upload image to firebase
        let uploadTask = storageRef.putData(uplodaData, metadata: nil, completion: { (metadata, error) in
            if error != nil{
                print(error)
                return
            }
            if let imageUrl = metadata?.downloadURL()?.absoluteString{
                print(imageUrl)
                uploadedImageUrlsArray.append(imageUrl)

                uploadCount += 1
                print("Number of images successfully uploaded: \(uploadCount)")
                if uploadCount == imagesCount{
                    NSLog("All Images are uploaded successfully, uploadedImageUrlsArray: \(uploadedImageUrlsArray)")
                    completionHandler(uploadedImageUrlsArray)
                }
            }

        })


        observeUploadTaskFailureCases(uploadTask : uploadTask)   
    }  
} 


//Func to observe error cases while uploading image files, Ref: https://firebase.google.com/docs/storage/ios/upload-files


    static func observeUploadTaskFailureCases(uploadTask : StorageUploadTask){
        uploadTask.observe(.failure) { snapshot in
          if let error = snapshot.error as? NSError {
            switch (StorageErrorCode(rawValue: error.code)!) {
            case .objectNotFound:
              NSLog("File doesn't exist")
              break
            case .unauthorized:
              NSLog("User doesn't have permission to access file")
              break
            case .cancelled:
              NSLog("User canceled the upload")
              break

            case .unknown:
              NSLog("Unknown error occurred, inspect the server response")
              break
            default:
              NSLog("A separate error occurred, This is a good place to retry the upload.")
              break
            }
          }
        }
    }

}

использование

let arrayOfImages : [UIImage] = [Image1, Image2, Image3]
UploadImages.saveImages(imagesArray: arrayOfImages)
 Travis Delly29 мар. 2019 г., 07:09
Поскольку это цикл, разве это не создает фоновые потоки, и обработчик завершения может иметь не все загруженные URL, когда он возвращается?

Ваш ответ на вопрос