2017-10-22 7 views
0

データをフェッチしたいが、これを何度もやったことがあるが、何らかの理由でそれが動作していないため、理由が分からない。Firebaseがユーザデータを取得する -

データ

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、または電子メールが返されず、エラー:致命的なエラー:unexpectedly found nil while unwrapping an Optional valueが返されます。

答えて

2

あなたのクラッシュログにはすべてが記載されています。あなたはキャストas!によってオプション変数のラップを強制的に解除しようとしています。 snapshotに有効な値が設定されていることを確認してください。あなたの答えのための

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!)") 
     } 

    } 
+0

ありがとう:

また、そうたい、より良いモデルが、これは安全です。今すぐブレークポイントとPOスナップショットを取得すると、ユーザーのデータが返されます。しかし、これを次のような変数に割り当てようとしています。 let user = UserClass(s​​napshot:currentUser)! 、次にデバッグコンソールのPOユーザー。ただし、データは「Some」として返され、user.photoURLを割り当てようとするとクラッシュし、データが判読不能またはnilであるためクラッシュします。 乾杯。 –

+0

「PhotoURL」の大文字になった –

関連する問題