繁体   English   中英

我想从 firebase storage ios swift 获取图像的下载 url

[英]I want to get the download url of image from firebase storage ios swift

我正在使用 firebase 上传一些图片,它工作正常,但问题是我无法获取图片的下载 url

这是我的代码

@IBAction func btnUploadImgsAction(_ sender: UIButton) {


    let url1 = uploading(img: Img1)
    print("///////////img 1   //////// \(url1)   ////////")
    let url2 = uploading(img: Img2)
    print("///////////img 2   //////// \(url2)   ////////")
    let url3 = uploading(img: Img3)
    print("///////////img 3   //////// \(url3)   ////////")
    let url4 = uploading(img: Img4)
    print("///////////img 4   //////// \(url4)   ////////")


}


func uploading( img : UIImageView)-> String{
    var strURL = ""
    let imageName = NSUUID().uuidString
    let storeImage = self.storageRef.child("profile_Images").child(imageName)

    if let uploadImageData = UIImagePNGRepresentation((img.image)!){
        storeImage.putData(uploadImageData, metadata: nil, completion: { (metaData, error) in
            storeImage.downloadURL(completion: { (url, error) in
                if let urlText = url?.absoluteString {

                     strURL = urlText
                    print("///////////tttttttt//////// \(strURL)   ////////")


                }
            })
        })


    }

    return strURL
}

当我在上传方法中打印 strURL 时,url 来了,但是当我在 btnUploadImgsAction 中打印时,它没有来,我有什么错?? 请帮助提前致谢

您应该创建一个闭包方法而不是直接返回字符串的方法,因为此方法是异步方法

您的方法声明应如下所示

func uploading( img : UIImageView, success: (url: String) -> Void) {
 // return with clouser
 success(url: strurl)
}

用你的方法更新

func uploading( img : UIImageView, completion: @escaping ((String) -> Void)) {
    var strURL = ""
    let imageName = NSUUID().uuidString
    let storeImage = self.storageRef.child("profile_Images").child(imageName)

    if let uploadImageData = UIImagePNGRepresentation((img.image)!){
        storeImage.putData(uploadImageData, metadata: nil, completion: { (metaData, error) in
            storeImage.downloadURL(completion: { (url, error) in
                if let urlText = url?.absoluteString {

                    strURL = urlText
                    print("///////////tttttttt//////// \(strURL)   ////////")

                    completion(strURL)
                }
            })
        })
    }
}

函数调用将是

let str = uploading(img: imageObject) { (url) in
     print(url)
 }

使用“ completion(strURL)”有助于成功地从其功能中检索strURL,但是当我尝试使用putData将strURL保存在数据库中时,数据库中的任何条目都不会被保存(“ url?.absoluteString”的值为“可选” (“ https:// firebasestorage ...”)',并在Firebase数据库中保留nil值)。 无论如何,保存Firebase存储没有问题。 有没有一种方法可以强制解开“ url?.absoluteString”,以便它将String值返回给strURL? 如果有人帮助我,我会非常感激!!!

我的代码是这样的:

     newImageRef.putData(imageData, metadata: nil) { (metadata, error) in       
            newImageRef.downloadURL(completion: {(url, error) in
                if let downloadURL = url?.absoluteString , error == nil {
                    self.imageDownloadURL = downloadURL
                    completion(self.imageDownloadURL)
                    print("Image URL is: \(self.imageDownloadURL)")
                }
            })
        }

暂无
暂无

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

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