Swift 在创建新的配置文件映像URL之前,请检查Firebase存储
当用户登录到我的应用程序时,我在检查Firebase存储时遇到了一些问题。当用户登录到Firebase数据库和存储中时,图像被成功创建并存储在Firebase数据库和存储中,但每次用户注销并重新登录到应用程序时,profileImage文件(不是子值url字符串)在Firebase存储中作为新的单独图像文件复制 我希望应用程序在登录时检查Firebase存储中的profileImage文件,如果它存在,则不要在存储中重新创建相同的图像。我了解检查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图像的逻辑,如果不存在,则创建新图
// 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")
}
})
}