2017-10-22 5 views
0

데이터를 가져오고 싶습니다. 여러 번했는데 어떤 이유로 작동하지 않고 이유가 없습니다. 데이터Firebase가 사용자 데이터를 가져옵니다 - Swift

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

내가 읽기를 설정하고 true로 규칙을 작성했다

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

    } 
} 

내 사용자 클래스 파일을 가져 오는에 대한

내 코드입니다. fetchCurrentUserInfo 함수를 호출하면 이름, 성, 키 등의 모든 데이터가 반환되지만 사진 URL, UID 또는 전자 메일이 nil로 반환되므로 오류가 발생합니다. 치명적인 오류 : 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 (snapshot : currentUser)! 그런 다음 디버그 콘솔에서 PO 사용자. 그러나 데이터가 "일부"로 반환되고 데이터를 읽을 수 없거나 없으면 user.photoURL을 할당하려고 할 때 충돌이 발생합니다. 건배. –

+0

잠깐, "PhotoURL"에 대문자로 내려 갔다는 것을 알았습니다. –

관련 문제