1

사용자가 내 응용 프로그램에 로그인 할 때 Firebase Storage를 확인하는 데 약간의 문제가 있습니다. 사용자가 로그인 할 때 이미지가 생성되어 Firebase 데이터베이스와 스토리지에 성공적으로 저장되지만 사용자가 로그 아웃하고 앱에 다시 로그인 할 때마다 (자식 값 URL 문자열이 아닌) profileImage 파일이 Firebase Storage에 새로운 것으로 복제됩니다 별도의 이미지 파일.새 프로필을 만들기 전에 Firebase 저장소를 확인하십시오. 이미지 URL

ProfileImage 파일에 대한 Firebase 저장소를 확인하기 위해 로그인 할 때 응용 프로그램을 사용하고 싶다면 저장소에 같은 이미지를 다시 만들지 마십시오. 나는 새로운 이미지를 만드는 것보다 Firebase가 이미지인지 아닌지를 확인하는 논리를 이해합니다. 구문에 문제가 있습니다. 미리 도움을 주셔서 감사합니다!

// login user with Facebook 
func loginWithFacebook() { 
    let accessToken = FBSDKAccessToken.current() 
    guard let accessTokenString = accessToken?.tokenString else { return } 

    let credentials = FIRFacebookAuthProvider.credential(withAccessToken: accessTokenString) 
    FIRAuth.auth()?.signIn(with: credentials, completion: { (user, error) in 
     if error != nil { 
      print("Something went wrong with our FB user: ", error ?? "") 
      return 
     } 

     guard let uid = user?.uid else { 
      return 
     } 

     let imageName = NSUUID().uuidString 
     let storageRef = FIRStorage.storage().reference().child("profile_images").child("\(imageName).png") 
     let photoUrl = user?.photoURL 

     // check to see if current user already has stored image with URL 
     if FIRStorage.storage().reference().child("profile_images").child("\(imageName).png") == nil { 

      if let imageData = NSData(contentsOf: photoUrl!) { 
       storageRef.put(imageData as Data, metadata:nil) { 
        (metadata, error) in 

        if error != nil { 
         print(error!) 
         return 
        } else { 

         if let profileImageUrl = metadata?.downloadURL()?.absoluteString { 
          let values = ["name": user!.displayName!, "email": user!.email!, "profileImageUrl": profileImageUrl] 
          self.registerUserWithUID(uid: uid, values: values as [String : AnyObject]) 
         } 
        } 
       } 
      } 
     } else { 
      print("image already exists") 
     } 

     print("Successfully logged in with our user: ", user ?? "") 
     self.delegate?.finishLoggingIn() 

     }) 

private func registerUserWithUID(uid: String, values: [String: AnyObject]) { 
    // create items in database upon creating user --------------- 
    let ref = FIRDatabase.database().reference() 
    let usersReference = ref.child("users").child(uid) 
    usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in 
     if err != nil { 
      print(err!) 
      return 
     } 
     print("user has been saved to Firebase database") 
    }) 
} 

답변

1

"if"조건에 문제가 있다고 생각합니다. 위치를 참조하고 있지만 해당 위치의 실제 데이터로 확인하지 않았습니다.

.observerSingleEventOf()를 사용하여 구현할 수 있습니다.

private func checkUser (imageName:String, _ completionHandler: @escaping(Bool) -> Void) 
    { 
    let userExists = FIRStorage.storage().reference().child("profile_images") 
    userExists.observeSingleEvent(of: .value, with:{(snapshot) in 
     if snapshot.hasChild(imageName){ 
     print ("Image already exists") 
     completionHandler(false) 
     } 
     else 
     { 
     print ("Image does not exist") 
     print ("store the image") 
     } 
    }) 
    } 

`

+0

덕분에 - 의미가 있습니다. 하지만 여전히 오류가 발생하고 있습니다. "FIRStorageReference 타입의 값에는 'observeSingleEvent'멤버가 없습니다 ... 이유에 대한 의견이 있습니까? – user3708224

+0

@ user3708224 죄송합니다. firebase 데이터베이스에 대해 생각했습니다. http : // stackoverflow .com/questions/38184900/firebase-storage-file-if-a-fire-storage-file-exists가 존재합니다. – vira