Ios Firebase获取用户数据-Swift
我想获取数据,我已经多次这样做了,但出于某种原因,它不起作用,我看不出原因 获取数据的代码Ios Firebase获取用户数据-Swift,ios,swift,firebase,Ios,Swift,Firebase,我想获取数据,我已经多次这样做了,但出于某种原因,它不起作用,我看不出原因 获取数据的代码 func fetchCurrentUserInfo() { let currentUser = Auth.auth().currentUser! let currentUserRef = dataBaseRef.child("users").child(currentUser.uid) currentUserRef.observeSingleEvent(of: .value,
func fetchCurrentUserInfo() {
let currentUser = Auth.auth().currentUser!
let currentUserRef = dataBaseRef.child("users").child(currentUser.uid)
currentUserRef.observeSingleEvent(of: .value, with: { (snapshot) in
let user = UserClass(snapshot: snapshot)
self.downloadImageFromFirebase(urlString: user.photoURL!)
self.userName.text = user.getFullName()
//SD Cache
self.userProfileImage.sd_setImage(with: URL(string: user.photoURL!), placeholderImage: UIImage(named: "UserImageTemplate"))
}) { (error) in
let alert = SCLAlertView()
_ = alert.showError("OOPS!", subTitle: error.localizedDescription)
}
}
我的用户类文件
struct UserClass {
var firstName: String?
var email: String?
var photoURL: String?
var uid: String?
var ref: DatabaseReference!
var key: String?
var lastName: String?
var accountType: String?
init(snapshot: DataSnapshot){
key = snapshot.key
ref = snapshot.ref
accountType = (snapshot.value! as! NSDictionary)["Account Type"] as? String
firstName = (snapshot.value! as! NSDictionary)["First Name"] as? String
email = (snapshot.value! as! NSDictionary)["email"] as? String
uid = (snapshot.value! as! NSDictionary)["uid"] as? String
photoURL = (snapshot.value! as! NSDictionary)["photoURL"] as? String
lastName = (snapshot.value! as! NSDictionary)["Last Name"] as? String
}
func getFullName() -> String {
return ("\(firstName!) \(lastName!)")
}
}
}
我已将读写规则设置为true。当我调用fetchCurrentUserInfo函数时,它会返回名字、姓氏、密钥等的所有数据。但它会将照片URL、UID或电子邮件返回为nil,并给出错误:致命错误:
在打开可选值时意外发现nil
崩溃日志说明了一切。您正试图通过as强制展开可选变量代码>铸造。确保快照中有有效值
此外,更好的车型也会这样,这样更安全:
struct UserClass {
var firstName: String!
var email: String!
var photoURL: String!
var uid: String!
var ref: DatabaseReference!
var key: String!
var lastName: String!
var accountType: String!
init?(snapshot: DataSnapshot?) {
guard let value = snapshot?.value as? [String: AnyObject],
let accountType = value["Account Type"] as? String,
let firstName = value["First Name"] as? String,
let email = value["email"] as? String,
let uid = value["uid"] as? String,
let photoURL = value["photoURL"] as? String,
let lastName = value["Last Name"] as? String else {
return nil
}
self.key = snapshot?.key
self.ref = snapshot?.ref
self.accountType = accountType
self.firstName = firstName
self.email = email
self.uid = uid
self.photoURL = photoURL
self.lastName = lastName
}
func getFullName() -> String {
return ("\(firstName!) \(lastName!)")
}
}
你的事故记录说明了一切。您正试图通过as强制展开可选变量代码>铸造。确保快照中有有效值
此外,更好的车型也会这样,这样更安全:
struct UserClass {
var firstName: String!
var email: String!
var photoURL: String!
var uid: String!
var ref: DatabaseReference!
var key: String!
var lastName: String!
var accountType: String!
init?(snapshot: DataSnapshot?) {
guard let value = snapshot?.value as? [String: AnyObject],
let accountType = value["Account Type"] as? String,
let firstName = value["First Name"] as? String,
let email = value["email"] as? String,
let uid = value["uid"] as? String,
let photoURL = value["photoURL"] as? String,
let lastName = value["Last Name"] as? String else {
return nil
}
self.key = snapshot?.key
self.ref = snapshot?.ref
self.accountType = accountType
self.firstName = firstName
self.email = email
self.uid = uid
self.photoURL = photoURL
self.lastName = lastName
}
func getFullName() -> String {
return ("\(firstName!) \(lastName!)")
}
}
谢谢你的回答。现在,如果我使用断点和PO快照,它将返回用户的数据。但是,我尝试将其分配给这样一个变量:let user=UserClass(snapshot:currentUser)!然后是调试控制台中的PO用户。但是,数据返回为“Some”,并在尝试分配user.photoURL时崩溃,因为数据不可读或为零。干杯。等等,我才意识到这是“PhotoURL”的资本化。谢谢你的回答。现在,如果我使用断点和PO快照,它将返回用户的数据。但是,我尝试将其分配给这样一个变量:let user=UserClass(snapshot:currentUser)!然后是调试控制台中的PO用户。但是,数据返回为“Some”,并在尝试分配user.photoURL时崩溃,因为数据不可读或为零。干杯。等等,我才意识到这是因为“PhotoURL”的资本化