2016-09-21 5 views
0

firebaseダッシュボードに格納されている値にアクセスして、クラスのさまざまな関数やメソッドでそれらを使用しようとしています。ファイアベースに格納されているデータの値を取得する

I used this method in this question

私はそれらの値を印刷しようとしましたが、全体のアプリがクラッシュした、それが彼らのnilのことを私に与えました!

実際にはそれらはありません。 私は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) 

} 

なぜ私はここでクラッシュしているのですか?

+0

?それがどこで動作し、どこがクラッシュするのかを言いなさい! – Santosh

+0

特定の行はありません。しかし、アプリ全体のクラッシュ – Mariah

+0

アプリ全体のクラッシュはどういう意味ですか? – Santosh

答えて

0

変更ref.child(byAppendingPath: self.strUserid as String)

へ: -

ref.child(self.strUserid) 

またlet refer = FIRDatabase.database().reference().child("UserDevices")を削除します。

あなたが初期化されている、あなたのクラスを注文するかわからない、と考えられるシナリオはあなたが初期化しようとすると、あなたの FIRDatabaseもまだ初期化されていないということですので、あなたが範囲外グローバルに参照を初期化することはできません

let refer

代わりのあなたはのViewControllerライフサイクルで見るretrieveUserData使用

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

referのviewDidLoadviewWillAppearよりも前に呼び出されます。

だからあなたが必要なものある: -

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

     } 

    } 

enter image description here

読む:それはクラッシュされている行Viewcontroller's Lifecycle

+0

私は自分の答えを更新しました。 – Dravidian

+0

答えが更新されました...うまくいきましたか? – Dravidian

+0

私はまだ値を取得するのに問題があります! – Mariah

関連する問題