Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
等待图像上传后再继续功能-Swift 5 Firebase存储_Swift_Xcode_Firebase_Firebase Storage_Swift5 - Fatal编程技术网

等待图像上传后再继续功能-Swift 5 Firebase存储

等待图像上传后再继续功能-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

我正在尝试使用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 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)下面
正如在回答中所说的,我现在明白了,这似乎有效。谢谢您的帮助!回答得很好!!好问题!!