2016-06-12 17 views
2

私はSwift iOSプロジェクトでGoogle Firebaseを使用しています。ユーザーがアップロードする写真を1つ以上選択するアプリの一部があります。私はFirebase Storageに一度に選択したすべての写真をアップロードするためのベストプラクティスを見つけようとしています。私は1枚の写真をアップロードする方法を知っています。Google Firebaseで複数の画像を同時にアップロードする

複数のNSDataオブジェクトをアップロードする方法がDocsを見ていないので、forループを実行して個々の画像を個別にアップロードするだけですか?

ありがとうございます!すべてのフィードバックは高く評価されます。

コメントで@FrankVanPuffellenによって回答
+2

あなたと思います実際にちょうどループと個別にアップロードします。 iOSユーザーは、一度に1つずつアップロードすれば、途中でアップロードを中断することができます。 –

+0

@FrankvanPuffelen、これがどのように行われたかのサンプルコードを提供できますか?これを実現するためにpromiseKitのようなサードパーティライブラリを実装する必要がありますか? https://github.com/mxcl/PromiseKit – user44776

答えて

0

...

「あなただけのループ確かだろうと個別にアップロードします。あなたが一度にそれらを1つずつアップロードする場合、彼らは中止することができるようにあなたのiOSユーザーにも、感謝かもしれませんすべての画像の進捗を失うことなく途中でアップロードしてください。 - Frank van Puffelen

11

swift 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) 
関連する問題