iOS聊天应用Firebase Storage调用downloadURL获取头像地址报错
错误原因
你调用downloadURL方法的对象是DatabaseReference类型,这是Firebase Realtime Database的引用实例,只有Firebase Storage的引用StorageReference才支持downloadURL方法,这就是报错提示找不到该成员的核心原因。
修复方案
1. 调整存储相关逻辑归属
不要在负责数据库操作的NetworkingService中写存储相关方法,存储操作统一归到StoreManager中,给StoreManager新增获取下载链接的方法:
struct StoreManager{ static let shared = StoreManager() private let storageRefrence = Storage.storage().reference() // 原有uploadProfilePic方法保留 // 新增获取下载链接方法 func getDownloadURL(for path: String, completion: @escaping (Result<URL, Error>) -> Void) { let reference = storageRefrence.child(path) reference.downloadURL { url, error in guard let url = url, error == nil else { completion(.failure(StorageErrors.failedToGetDownloadUrl)) return } completion(.success(url)) } } }
2. 删除无效方法
删掉NetworkingService类中错误的downloadURL方法。
3. 调整ProfileViewController的加载逻辑
在getProfilePic方法中调用新增的方法加载头像即可:
func getProfilePic(){ guard let userEmail = UserDefaults.standard.value(forKey: "useremail") as? String else { return } let userEmailForPic = NetworkingService.emailForImage(emailAddress: userEmail) let fileName = userEmailForPic + "_profile_image_jpg" let storagePath = "images/"+fileName StoreManager.shared.getDownloadURL(for: storagePath) { [weak self] result in switch result { case .success(let url): // 可直接使用Kingfisher/SDWebImage等第三方库加载网络图片 // 无第三方库可以用原生方式加载 DispatchQueue.global().async { if let imageData = try? Data(contentsOf: url), let avatar = UIImage(data: imageData) { DispatchQueue.main.async { self?.currentUserPic.image = avatar } } } case .failure(let error): print("头像加载失败:\(error.localizedDescription)") } } }
额外问题修复
你原有NetworkingService的userExists方法存在逻辑错误,异步回调写在了闭包外面,无论查询结果如何都会返回true,修正如下:
func userExists(email: String,completion: @escaping((Bool) -> Void)){ var safeEmail = email.replacingOccurrences(of: ".", with: "-") safeEmail = safeEmail.replacingOccurrences(of: "@", with: "-") database.child(safeEmail).observeSingleEvent(of: .value) { (snapshot) in completion(snapshot.exists()) } }
内容的提问来源于stack exchange,提问作者Faheem
相关产品推荐
相关产品推荐

