gpt4 book ai didi

swift - 从当前用户更新 firebase 数据库

转载 作者:行者123 更新时间:2023-11-28 13:52:15 25 4
gpt4 key购买 nike

我想将图像存储在 firebase 存储中并创建 url 而不是从我当前的 firebase 数据库更新值,但它没有存储在当前用户的 firebase 数据库中。这是我的代码,我哪里做错了?

fileprivate func saveToFirebase(image: UIImage) {
guard let imageData = image.jpegData(compressionQuality: 0.3) else { return }
let uuidName = UUID().uuidString

Storage.storage().reference().child("profile_images").child(uuidName).putData(imageData, metadata: nil) { (metadata, error) in
if let err = error {
print("💥 -- Failed to upload images -- 💥")
print("💥 -- \(err) -- 💥")
return
}

metadata?.storageReference?.downloadURL(completion: { (url, error) in
if let err = error {
print("💥 -- Failed to create URL -- 💥")
print("💥 -- \(err) -- 💥")
return
}

guard let profileImageURL = url?.absoluteString else { return }
guard let currentUID = Auth.auth().currentUser?.uid else { return }
let userProfileURL = ["profileImageURL": profileImageURL]

Database.database().reference().child("users").child(currentUID).updateChildValues(userProfileURL, withCompletionBlock: { (error, reference) in
if let err = error {
print("💥 -- Failed to create URL -- 💥")
print("💥 -- \(err) -- 💥")
return
}
print("✅ -- Successfully update user data -- ✅")
})
})
}
}

最佳答案

首先,我们可以创建一个枚举来表示可能发生的不同故障。一些我们认为是错误的场景(例如 guard else 返回 void,或断开的链式可选)会静静地失败。这里我们可以封装需要处理的不同故障场景。

enum ProfileImageUploadError: Error {
case unauthenticatedUser
case invalidImageData
case failedDataUpload(Error?)
case failedDownloadURL(Error?)
case failedProfileUpdate(Error?)

var localizedDescription: String {
switch self {
case .failedDataUpload: return "Failed to upload data"
case .failedDownloadURL: return "Failed to download URL"
case .failedProfileUpdate: return "Failed to update profile"
default: return "\(self)"
}
}

var underlyingError: Error? {
switch self {
case .failedDataUpload(let err): return err
case .failedDownloadURL(let err): return err
case .failedProfileUpdate(let err): return err
default: return nil
}
}
}

接下来,我们可以立即确定我们有一个经过身份验证的用户并且图像数据已 check out 。当守卫失败时,我们调用完成 block 传递该场景的错误情况。保持这种状态,我们构建对存储和数据库提供程序的引用,并尝试序列捕获错误。

鉴于最初上传数据没有错误,我们可以假设图像已经上传。此外,我们可以使用之前构建的存储引用来下载 URL,而不是使用可选的元数据。

随着我们继续执行操作序列,我们会尝试充分处理我们认为是错误的内容,直到成功完成,此时我们可以将保存到 Firebase 数据库的 URL 返回。

func uploadProfileImage(_ image: UIImage, completion: @escaping (URL?, ProfileImageUploadError?) -> ()) {

guard let currentUser = Auth.auth().currentUser else {
return completion(nil, .unauthenticatedUser)
}

guard let imageData = image.jpegData(compressionQuality: 0.3) else {
return completion(nil, .invalidImageData)
}

let storagePath = "profile_images/\(UUID().uuidString)"
let databasePath = "users/\(currentUser.uid)/profileImageURL"

let profileImageDataRef = Storage.storage().reference(withPath: storagePath)
let profileImageURLRef = Database.database().reference(withPath: databasePath)

profileImageDataRef.putData(imageData, metadata: nil) { (metadata, error) in
guard error == nil else {
return completion(nil, .failedDataUpload(error))
}

profileImageDataRef.downloadURL { (url, error) in
guard let profileImageURL = url?.absoluteString else {
return completion(nil, .failedDownloadURL(error))
}

profileImageURLRef.setValue(profileImageURL, withCompletionBlock: { (error, ref) in
guard error == nil else {
return completion(nil, .failedProfileUpdate(error))
}

completion(url, nil)
})
}
}
}

最后,这是您在现有函数中使用该函数的方式。

fileprivate func saveToFirebase(image: UIImage) {
uploadProfileImage(image) { (url, error) in
if let error = error {
print("💥 -- \(error.localizedDescription) -- 💥")
print("💥 -- \(error.underlyingError.debugDescription) -- 💥")
} else {
print("✅ -- Successfully update user data -- ✅")
print("✅ -- \(url.debugDescription) -- ✅")
}
}
}

这没有经过测试

因此,回顾一下,函数中的某些行可能会默默地“失败”,这可以通过充分处理“可选”和完成错误或简单地打印语句来解决。我认为是导致问题的 URL 下载的可选属性链——特别是 metadata?.storageReference?.downloadURL 中的元数据属性。

关于swift - 从当前用户更新 firebase 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54397419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com