Ios 如何使用swift在firebase上上载多个图像?

Ios 如何使用swift在firebase上上载多个图像?,ios,swift,firebase,firebase-storage,Ios,Swift,Firebase,Firebase Storage,我只想用swift在firebase上上传多张图片。我现在上传一张图片,但无法上传多张图片。这是我的密码 let photoIdString = NSUUID().uuidString let storageRef = Storage.storage().reference(forURL: Config.STORAGE_ROOF_REF).child("posts").child(photoIdString) storageRef.putData(imageData, metadata: nil

我只想用swift在firebase上上传多张图片。我现在上传一张图片,但无法上传多张图片。这是我的密码

let photoIdString = NSUUID().uuidString
let storageRef = Storage.storage().reference(forURL: Config.STORAGE_ROOF_REF).child("posts").child(photoIdString)
storageRef.putData(imageData, metadata: nil,completion: {(metadata,error) in

       if error != nil {
            return
       }
       let photoUrl = metadata?.downloadURL()?.absoluteString
       let ref = Database.database().reference()
       let postReference = ref.child("posts")
       let newPostId = postReference.childByAutoId().key
       let newPostReference = postReference.child(newPostId)
       newPostReference.setValue(["photoUrl":photoUrl,"caption":self.textView.text!]) 

目前没有直接的API来批量上传/下载文件。我们不能使用循环,因为所有任务都是异步执行的。我们能做的就是使用递归函数

核心逻辑

二,。这里我们怎么用这个

首先,为主功能创建一个完成块,它将让您知道何时所有图像都将成功上传

/// This is your images array
let images = [image1, image2, image3, image4]

/// Here is the completion block
typealias FileCompletionBlock = () -> Void
var block: FileCompletionBlock?
下面是两个函数,第一个是初始函数,它将开始上传,第二个是递归函数,如果有下一个图像可以上传,它将调用自己

func startUploading(completion: @escaping FileCompletionBlock) {
     if images.count == 0 {
        completion()
        return;
     }

     block = completion
     uploadImage(forIndex: 0)
}

func uploadImage(forIndex index:Int) {

     if index < images.count {
          /// Perform uploading
          let data = UIImagePNGRepresentation(images[index])!
          let fileName = String(format: "%@.png", "yourUniqueFileName")

          FirFile.shared.upload(data: data, withName: fileName, block: { (url) in
              /// After successfully uploading call this method again by increment the **index = index + 1**
              print(url ?? "Couldn't not upload. You can either check the error or just skip this.")
              self.uploadImage(forIndex: index + 1)
           })
        return;
      }

      if block != nil {
         block!()
      }
}
编辑新Firebase的上载功能:

唯一的区别是获取下载url的方式。这是同一张表


目前没有直接的API来批量上传/下载文件。我们不能使用循环,因为所有任务都是异步执行的。我们能做的就是使用递归函数

核心逻辑

二,。这里我们怎么用这个

首先,为主功能创建一个完成块,它将让您知道何时所有图像都将成功上传

/// This is your images array
let images = [image1, image2, image3, image4]

/// Here is the completion block
typealias FileCompletionBlock = () -> Void
var block: FileCompletionBlock?
下面是两个函数,第一个是初始函数,它将开始上传,第二个是递归函数,如果有下一个图像可以上传,它将调用自己

func startUploading(completion: @escaping FileCompletionBlock) {
     if images.count == 0 {
        completion()
        return;
     }

     block = completion
     uploadImage(forIndex: 0)
}

func uploadImage(forIndex index:Int) {

     if index < images.count {
          /// Perform uploading
          let data = UIImagePNGRepresentation(images[index])!
          let fileName = String(format: "%@.png", "yourUniqueFileName")

          FirFile.shared.upload(data: data, withName: fileName, block: { (url) in
              /// After successfully uploading call this method again by increment the **index = index + 1**
              print(url ?? "Couldn't not upload. You can either check the error or just skip this.")
              self.uploadImage(forIndex: index + 1)
           })
        return;
      }

      if block != nil {
         block!()
      }
}
编辑新Firebase的上载功能:

唯一的区别是获取下载url的方式。这是同一张表


先生,请详细说明。请更新您的答案“StorageMetadata”类型的值没有成员“downloadURL”错误Firebase5@Nitesh按要求更新。泰国人很棒。谢谢@Tiger bhai。。。!先生,请详细说明。请更新您的答案“StorageMetadata”类型的值没有成员“downloadURL”错误Firebase5@Nitesh按要求更新。泰国人很棒。谢谢@Tiger bhai。。。!看看这个视频,也许它可以帮助你看看这个视频,也许它可以帮助你
startUploading {
    /// All the images have been uploaded successfully.
}
func upload(data: Data,
            withName fileName: String,
            atPath path:StorageReference,
            block: @escaping (_ url: String?) -> Void) {

    // Upload the file to the path
    self.currentUploadTask = path.putData(data, metadata: nil) { (metaData, error) in
         guard let metadata = metadata else {
              // Uh-oh, an error occurred!
              block(nil)
              return
         }
         // Metadata contains file metadata such as size, content-type.
         // let size = metadata.size
         // You can also access to download URL after upload.
         path.downloadURL { (url, error) in
              guard let downloadURL = url else {
                 // Uh-oh, an error occurred!
                 block(nil)
                 return
              }
             block(url)
         }
    }
}