等待图像上传后再继续功能-Swift 5 Firebase存储
我正在尝试使用Firebase存储上载图像。我遇到的问题是,当我调用我的图像上传函数时,上传任务非常慢,当它实际被进一步调用时,它最后运行在我的主函数中 是否有办法等待storageRef.putData完成,然后再继续该函数的其余部分 从1降低压缩质量可能会更快吗 以下是我的功能:等待图像上传后再继续功能-Swift 5 Firebase存储,swift,xcode,firebase,firebase-storage,swift5,Swift,Xcode,Firebase,Firebase Storage,Swift5,我正在尝试使用Firebase存储上载图像。我遇到的问题是,当我调用我的图像上传函数时,上传任务非常慢,当它实际被进一步调用时,它最后运行在我的主函数中 是否有办法等待storageRef.putData完成,然后再继续该函数的其余部分 从1降低压缩质量可能会更快吗 以下是我的功能: func newImageUrl(){ let key = self.itemId guard let userID = Auth.auth().currentUser?.uid else { re
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 updateItemDetail(){
print("this is running 1")
self.newImageUrl { (str) in
print(str)
}
print("this is running 2")
更新的func--
示例主要功能:
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 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")
你需要完成
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)
}
}
}
召唤
由于某种原因无法工作,storageRef.putData函数仍在延迟后最后一次调用。它将打印“开始图像上传”,完成我的主要功能的其余部分,延迟1-3秒(取决于我假设的文件大小),然后运行storageRef.putData..etc为主要问题添加新代码以使问题更清楚它正在工作,现在将上传后需要执行的逻辑直接放在
打印(str)下面
正如在回答中所说的,我现在明白了,这似乎有效。谢谢您的帮助!回答得很好!!好问题!!