【发布时间】: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