Getting the values of data stored in firebase

China☆狼群 提交于 2019-12-25 08:44:21

问题


I'm trying to get access to the values stored in firebase dashboard to use them in different functions and methods in the class.

I used this method in this question

I have tried to print their values, the whole app has crashed and it gave me that their nil!

They are not nil actually! I used a similar method in viewDidLoad and I could retrieve the values to labels!

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)

}

Why I'm getting a crash here!


回答1:


Change ref.child(byAppendingPath: self.strUserid as String)

To:-

ref.child(self.strUserid)

Also remove let refer = FIRDatabase.database().reference().child("UserDevices").

You can not initialise your reference globally outside a scope because you don't know in which order your classes are being initialised, and probable scenario is that your FIRDatabase hasn't even been initialised yet when you try to initialise let refer.

Instead of refer in retrieveUserData use

FIRDatabase.database().reference().child("UserDevices")

You see in a viewController's LIFE CYCLE, viewdidLoad is called before than viewWillAppear:

So what you need is:-

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...

       }

  }

Read: Viewcontroller's Lifecycle



来源:https://stackoverflow.com/questions/39619860/getting-the-values-of-data-stored-in-firebase

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!