【问题标题】:Cannot store URLString in my Firebase Realtime-database无法将 URLString 存储在我的 Firebase 实时数据库中
【发布时间】:2019-07-11 13:12:50
【问题描述】:

我在我的 ViewController 中设置了 URLstring 变量,但是当我尝试在实时数据库中设置“profileImageURL”的值时,它不会显示所需的 URL,即使当我从 storageRef 中提取它时它也能很好地打印出来。

我虽然是因为我在方法中声明了 URLString 变量(我在本例中是一个 Button),但即使现在我在 ViewController 中声明它也不起作用。

这是代码:

Auth.auth().createUser(withEmail: emailTextField.text!, password: passwordTextField.text!) { (user, error) in

        if error != nil{
            print(error!.localizedDescription)
            return
        }

        let uid = Auth.auth().currentUser?.uid
        let storageRef = Storage.storage().reference(forURL: "gs://instagramclone-1ed36.appspot.com").child("Profile_Images").child(uid!)
        let ref = Database.database().reference()

        if let profileIMG = self.selectedImage, let imageData = profileIMG.jpegData(compressionQuality: 0.1){
            storageRef.putData(imageData, metadata: nil, completion: { (metadata, error) in
                if error != nil {
                    return
                }


                storageRef.downloadURL(completion: { (url, error) in
                    if error != nil {
                        return
                    }else {
                        self.URLString = url!.absoluteString
                        print("\n\n the URLString is : \(self.URLString)\n\n")
                    }

                })

                let userReference = ref.child("users")
                let newUserReference = userReference.child(uid!)
                newUserReference.setValue([ "profileImageURL": self.URLString])

            })
        }
    }

【问题讨论】:

  • 问题是这段代码 newUserReference.setValue([ "profileImageURL": self.URLString]) 将在 storageRef 闭包 self.URLString = url!.absoluteString 中的代码之前运行。 Firebase 是异步的,代码比互联网更快。因此,该 url 仅在 storageRef 闭包内有效 - 之后的任何代码都将在之前运行。

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


【解决方案1】:
// Fetch the download URL
            storageRef.downloadURL { url, error in
                if let error = error {
                    // Handle any errors
                    if(error != nil){
                        print(error)
                        return
                    }
                } else {
                    // Get the download URL for 'images/stars.jpg'
                    let urlStr:String = (url?.absoluteString) ?? ""
                    let values = ["imageUrl": urlStr,"date_time": self.getDate()]
                    self.registerUserIntoDatabaseWithUID(uid: userID, values: values as [String : AnyObject])
                }
            }


func registerUserIntoDatabaseWithUID(uid:String, values:[String:AnyObject]){
    let ref = Database.database().reference(fromURL: "https://yourpath.firebaseio.com/")
    let usersReference = ref.child("abc").child(uid).child("\(self.yourID!)")

    usersReference.updateChildValues(values) { (error, ref) in
        if(error != nil){
            print(error)
            return
        }
        self.dismiss(animated: true, completion: nil)
    }
}

【讨论】:

    猜你喜欢
    • 2019-04-10
    • 2020-03-21
    • 1970-01-01
    • 2017-12-04
    • 2020-05-11
    • 2019-04-07
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多