获取存储在firebase中的数据的值
问题描述:
我试图访问存储在firebase仪表板中的值以在类中的不同函数和方法中使用它们。获取存储在firebase中的数据的值
I used this method in this question
我试图打印他们的价值观,整个应用程序崩溃,它给了我,他们的零!
他们不是零! 我在viewDidLoad中使用了类似的方法,我可以检索值到标签!
let refer = FIRDatabase.database().reference().child("UserDevices")
var globalEmail : String!
var globalPhone : String!
var globalImageUrl: String!
override func viewWillAppear(_ animated : Bool){
super.viewWillAppear(animated)
retrieveUserData{(email,phone,ImageUrl) in
self.globalEmail = email
self.globalPhone = phone
self.globalImageUrl = ImageUrl
}
}
func retrieveUserData(_ completionBlock : @escaping ((_ email : String?, _ phone : String?, _ ImageUrl: String?)->Void)){
refer.child(byAppendingPath: self.strUserid as String).observe(.value , with: {snapshot in
if let userDict = snapshot.value as? [String:AnyObject] {
completionBlock(userDict["email"] as! String, userDict["phone"] as! String, userDict["ImageUrl"] as! String)
}
})
}
var strUserid : NSString!
override func viewDidLoad() {
super.viewDidLoad()
print(globalEmail)
print(globalImageUrl)
print(globalPhone)
self.navigationController?.navigationBar.tintColor = UIColor.white
print("idis \(self.strUserid)")
let ref = FIRDatabase.database().reference().child("UserDevices")
self.navigationController?.navigationBar.tintColor = UIColor.white
ref.child(byAppendingPath: self.strUserid as String).observe(.value, with: { snapshot in
if let dict = snapshot.value as? NSMutableDictionary{
print("dict is \(dict)")
if let Provider = dict["name"] as? String
{
self.DeviceDetailsProvider.text = Provider
// self.navigationItem.title = Provider
}
if let name = dict["DeviceName"] as? String
{
self.DeviceDetailsName.text = name
self.navigationItem.title = name
}
if let ShortDescription = dict["Description"] as? String
{
self.DeviceDetailsDescription.text = ShortDescription
}
if let City = dict["city"] as? String
{
self.DeviceDetailsCity.text = City
}
}
})
self.DeviceDetailsImageView.downloadedFrom(link: globalImageUrl)
}
为什么我会在这里发生故障!
答
变化ref.child(byAppendingPath: self.strUserid as String)
要: -
ref.child(self.strUserid)
同时删除let refer = FIRDatabase.database().reference().child("UserDevices")
。
您不能在范围外全局初始化您的引用,因为您不知道您的类正在初始化的顺序,可能的情况是您尝试初始化时尚未初始化您的数据库let refer
。
代替在refer
retrieveUserData
使用
FIRDatabase.database().reference().child("UserDevices")
您在的viewController的生命周期,viewDidLoad中看到的是比viewWillAppear中调用之前:
所以你需要什么是: -
override func viewDidLoad() {
super.viewDidLoad()
..
retrieveUserData{(email,phone,ImageUrl) in
self.globalEmail = email
self.globalPhone = phone
self.globalImageUrl = ImageUrl
self.DeviceDetailsImageView.downloadedFrom(link: globalImageUrl)
// .. Do your stuff...
}
}
哪一行导致崩溃?提到它在哪里工作,哪里崩溃! – Santosh
没有特定的线路。但整个应用程序崩溃 – Mariah
你是什么意思整个应用程序崩溃? – Santosh