【问题标题】:Wait for image to be uploaded before continuing function - Swift 5 Firebase Storage在继续功能之前等待图像上传 - Swift 5 Firebase Storage
【发布时间】:2019-08-21 21:53:06
【问题描述】:

我正在尝试使用 Firebase 存储上传图片。我遇到的问题是,当我调用我的图像上传函数时,上传任务非常慢,当它实际被进一步调用时,它最终在我的主函数中运行。

有没有办法等待 storageRef.putData 完成后再继续执行其余功能?

将压缩质量从 1 降低可能会更快吗?

这是我的功能:

func newImageUrl(){
    let key = self.itemId
    guard let userID = Auth.auth().currentUser?.uid else { return }
    let storageRef = Storage.storage().reference().child(userID).child("SubCategory").child(self.itemTitle!).child(key!).child("ItemImages.jpg")

    guard let imageData = self.itemImage.image!.jpegData(compressionQuality: 1) else { return }

    print("starting image upload!")
    storageRef.putData(imageData, metadata: nil) { (metadata, error) in
        guard let metadata = metadata else {
            return
        }

        storageRef.downloadURL { (url, error) in
            guard let urlStr = url else{
                return
            }
                let urlFinal = (urlStr.absoluteString)
                self.imageFinalUrl = urlFinal
        }
    }
}

更新函数--

func newImageUrl(completion:@escaping((String?) -> () )) {
let key = self.itemId
guard let userID = Auth.auth().currentUser?.uid else { completion(nil) ; return }
let storageRef = Storage.storage().reference().child(userID).child("SubCategory").child(self.itemTitle!).child(key!).child("ItemImages.jpg")

guard let imageData = self.itemImage.image!.jpegData(compressionQuality: 1) else { completion(nil) ; return }

print("starting image upload!")
storageRef.putData(imageData, metadata: nil) { (metadata, error) in
    guard let metadata = metadata else {
        return
    }

    storageRef.downloadURL { (url, error) in
        guard let urlStr = url else{
            completion(nil)
            return
        }
        let urlFinal = (urlStr.absoluteString)
        self.imageFinalUrl = urlFinal
        completion(urlFinal)
        }
    }
}

主函数示例:

func updateItemDetail(){
    print("this is running 1")
    self.newImageUrl { (str) in
        print(str)
    }
    print("this is running 2")

控制台打印:

this is running 1
starting image upload!
this is running 2
Optional("https://firebasestorage.googleapis.com/v0/b/.....etc")

【问题讨论】:

  • 好问题!!

标签: swift xcode firebase firebase-storage swift5


【解决方案1】:

你需要一个完成

func newImageUrl(completion:@escaping((String?) -> () )) {
    let key = self.itemId
    guard let userID = Auth.auth().currentUser?.uid else { completion(nil) ; return }
    let storageRef = Storage.storage().reference().child(userID).child("SubCategory").child(self.itemTitle!).child(key!).child("ItemImages.jpg")

    guard let imageData = self.itemImage.image!.jpegData(compressionQuality: 1) else { completion(nil) ; return }

    print("starting image upload!")
    storageRef.putData(imageData, metadata: nil) { (metadata, error) in
        guard let metadata = metadata else {
            return
        }

        storageRef.downloadURL { (url, error) in
            guard let urlStr = url else{
                completion(nil)
                return
            }
            let urlFinal = (urlStr.absoluteString)
            self.imageFinalUrl = urlFinal
            completion(urlFinal)
        }
    }
}

打电话

newImageUrl { (str) in
  print(str)
  // do your next work here
}

【讨论】:

  • 由于某种原因不起作用,storageRef.putData 函数在延迟后仍然被最后调用。它将打印“开始图像上传”,完成我的主要功能的其余部分,延迟 1-3 秒(取决于我假设的文件大小),然后运行 ​​storageRef.putData..etc
  • 向主要问题添加新代码,使问题更清晰
  • 它正在工作,现在将上传后需要执行的逻辑直接放在print(str) 下方,如答案
  • 我明白了,它似乎工作了谢谢你的帮助!
  • 很好的答案!!
猜你喜欢
  • 2020-04-01
  • 2020-01-15
  • 2020-12-24
  • 2012-01-28
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多