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)
あなたと思います実際にちょうどループと個別にアップロードします。 iOSユーザーは、一度に1つずつアップロードすれば、途中でアップロードを中断することができます。 –
@FrankvanPuffelen、これがどのように行われたかのサンプルコードを提供できますか?これを実現するためにpromiseKitのようなサードパーティライブラリを実装する必要がありますか? https://github.com/mxcl/PromiseKit – user44776