Swift 在创建新的配置文件映像URL之前,请检查Firebase存储

Swift 在创建新的配置文件映像URL之前,请检查Firebase存储,swift,firebase,firebase-realtime-database,firebase-storage,image-caching,Swift,Firebase,Firebase Realtime Database,Firebase Storage,Image Caching,当用户登录到我的应用程序时,我在检查Firebase存储时遇到了一些问题。当用户登录到Firebase数据库和存储中时,图像被成功创建并存储在Firebase数据库和存储中,但每次用户注销并重新登录到应用程序时,profileImage文件(不是子值url字符串)在Firebase存储中作为新的单独图像文件复制 我希望应用程序在登录时检查Firebase存储中的profileImage文件,如果它存在,则不要在存储中重新创建相同的图像。我了解检查Firebase图像的逻辑,如果不存在,则创建新图

当用户登录到我的应用程序时,我在检查Firebase存储时遇到了一些问题。当用户登录到Firebase数据库和存储中时,图像被成功创建并存储在Firebase数据库和存储中,但每次用户注销并重新登录到应用程序时,profileImage文件(不是子值url字符串)在Firebase存储中作为新的单独图像文件复制

我希望应用程序在登录时检查Firebase存储中的profileImage文件,如果它存在,则不要在存储中重新创建相同的图像。我了解检查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")
    })
}

我认为问题在于“如果”条件。您正在引用该位置,但未检查该位置中的实际数据

您可以使用.observerSingleEventOf()实现该功能


`

谢谢-很有意义。但我仍然收到一个错误“类型为'FIRStorageReference'的值没有成员'observeSingleEvent'…想知道为什么吗?@user3708224抱歉,我以为它是用于firebase数据库的。看看这个问题。
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")
      }
    })
  }