繁体   English   中英

SwiftUI:上传多张图片到Firebase

[英]SwiftUI: upload multiple images to Firebase

目标:从SwiftUI app上传3张图片到Firebase,每张不同的URL。

问题:我只上传了 1 个。

我尝试过的(但没有用)......:

storagePostRef.putData(image1, image2, image3, metadata: metadata) { (storageMetadata, error) in

完整的 function 波纹管:


static func savePostPhoto(
    
    
    //id
    userId: String,
    
    image1: Data,
    image2: Data,
    image3: Data,
    
   // imagesArray : [Data],


    metadata: StorageMetadata,
    storagePostRef: StorageReference,
    onSuccess: @escaping() -> Void,
    onError: @escaping(_ errorMessage: String) -> Void)

  {
    
    let arrayOfImages : [Data] = [image1, image2, image3]

        
    //image storage
    storagePostRef.putData(image1, metadata: metadata) { (storageMetadata, error) in
        
          if error != nil {
              onError(error!.localizedDescription)
              return
          }
        
        //image URL

        storagePostRef.downloadURL { (url, error) in
            
            let image1 = url?.absoluteString
            let image2 = url?.absoluteString
            let image3 = url?.absoluteString

   
        }
    }
    


}


每次调用putData都会在调用putData的位置存储一个图像。

因此,如果要存储三个单独的图像,则必须在三个不同的StorageReference对象上调用putData 然后,要获取三个下载 URL,您还要对三个StorageReference对象中的每一个调用downloadURL

storagePostRef1.putData(image1, metadata: metadata) { (storageMetadata, error) in
  storagePostRef1.downloadURL { (url1, error) in
    let image1 = url?.absoluteString  storagePostRef2.putData(image2, metadata: metadata) { (storageMetadata, error) in
      storagePostRef2.downloadURL { (url2, error) in
        storagePostRef3.putData(image3, metadata: metadata) { (storageMetadata, error) in
          storagePostRef3.downloadURL { (url3, error) in

您可以通过创建自己的帮助程序 function 来稍微清理一下,该帮助程序通过单个闭包/回调处理对putDatadownloadUrl的调用。

这很好用。

 var photoArrayModel = PhotoArrayModel(photoArray: [])
 let userPhotosFirstoreRef = self.ref.document(uid)
 imagesData.enumerated().forEach { index, imageData in
                let userPhotosStorageRef = self.storageRoot.child("user_photos").child(uid).child("image_\(index)")
                userPhotosStorageRef.putData(imageData, metadata: nil) { metaData, error in
                    if error != nil {
                        promise(.failure(.uploadingPhoto))
                    }
                    userPhotosStorageRef.downloadURL { url, error in
                        if error != nil {
                            promise(.failure(.uploadingPhoto))
                        }
                        guard let urlString = url?.absoluteString else { return promise(.failure(.uploadingPhoto))}
                        let photo = PhotoModel(ownerID: uid, imageURL: urlString, timeStamp: Date().millisecondsSince1970)
                        photoArrayModel.photoArray.append(photo)
                        
                        if photoArrayModel.photoArray.count == imagesData.count {
                            do {
                                try userPhotosFirstoreRef.setData(from: photoArrayModel.self)
                                promise(.success(()))
                            } catch {
                                promise(.failure(.uploadingPhoto))
                            }
                            
                        }
                    }
                }
            }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM