【问题标题】:How to retrieve the current user image and display in imageView?如何检索当前用户图像并在 imageView 中显示?
【发布时间】:2019-12-14 09:43:06
【问题描述】:

我想了解如何从 Firebase 为当前用户正确检索图像。我正在尝试从 User 表中获取用户 ImageUrl 并使用该 url 在下面显示图像,但它没有这样做并使应用程序崩溃。我想知道我做得对还是做错了。 提前谢谢你

   func retrieveTheImage() {
    
    let userID = Auth.auth().currentUser?.uid
    
    let retrieveTheUrl = Database.database().reference().child("User").child(userID!)
    
    
    var capatureUrl :String = ""
    retrieveTheUrl.observeSingleEvent(of: .value) { (snapShot) in
        
       
        if let snapShotValue = snapShot.value as? Dictionary<String,String>{
           
            let url = snapShotValue["ImageUrl"]! /
            capatureUrl = url
            print(capatureUrl)
        }
    }
    
    let storage = Storage.storage()
    var reference: StorageReference!
    reference = storage.reference(forURL: capatureUrl)
    reference.downloadURL { (url, error) in
        let data = NSData(contentsOf: url!)
        let image = UIImage(data: data! as Data )
        self.imageUser.image = image
    }
}

【问题讨论】:

    标签: ios swift firebase firebase-realtime-database firebase-storage


    【解决方案1】:

    您的代码实际上可以工作......几乎。

    代码的问题在于 Firebase 是异步的,因此数据仅在 firebase 调用后的闭包内才有效。

    这就是正在发生的事情(压缩代码)

        func retrieveTheImage2() {
            let userID = Auth.auth().currentUser?.uid
            let retrieveTheUrl = Database.database().reference().child("User").child(userID!)
               //code in closure//
            }
            
            //code after closure//
    -->     reference = storage.reference(forURL: capatureUrl) //not valid
            reference.downloadURL { (url, error) in
            }
        }
    

    闭包之后的代码将在闭包中的代码之前执行//。

    这意味着 capatureUrl 将为零,因为它还没有被填充。代码比互联网快。

    要解决这个问题,只需在闭包中移动从 Firebase 访问数据的代码。

    func retrieveTheImage2() {
        let userID = Auth.auth().currentUser?.uid
        let retrieveTheUrl = Database.database().reference().child("User").child(userID!)
        var capatureUrl :String = ""
        retrieveTheUrl.observeSingleEvent(of: .value) { (snapShot) in
            if let snapShotValue = snapShot.value as? Dictionary<String,String>{
                let url = snapShotValue["ImageUrl"]!
                capatureUrl = url
                print(capatureUrl)
                
                let storage = Storage.storage()
                var reference: StorageReference!
                reference = storage.reference(forURL: capatureUrl) //will be valid here.
                reference.downloadURL { (url, error) in
                    let data = NSData(contentsOf: url!)
                    let image = UIImage(data: data! as Data )
                    self.imageUser.image = image
                }
            }
        }
    }
    

    一般来说,数据从互联网返回需要时间,这就是 Firebase 闭包的目的 - 代码在数据有效时执行。因此,如果您想使用 Firebase 数据,请仅尝试最初在这些闭包中访问它。

    【讨论】:

    • 这是正确的,我也知道为什么大声笑,但现在错误在于 let data = NSData(contentsOf : url!) 为什么会这样?
    • 没关系,弄清楚 url 的问题是什么,它的 firebase 崩溃了,我要等到它自己修复吗?
    • @JoseGarcia 我刚刚运行了该代码,它对我有用。什么崩溃了,“修复自身”是什么意思?
    • 就像它说 let data = NSData... 它说 url 是 nil,所以我检查了我禁止的存储并说发现错误请刷新页面并看到我必须保存图像,所以我应该等到firebase自行修复,因为我知道这段代码可以工作,因为我试过了,现在因为firebase而不能工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多