iOS Swift从Firebase Storage取图时文件不存在导致App崩溃如何解决
问题根源
你的崩溃全部来源于代码中多处使用!强制解包可选值,只要对应值为空(比如文件不存在时downloadURL返回的url为nil、用户未登录时currentUser为nil)就会直接触发崩溃。
具体修改方案
你需要把所有强制解包逻辑替换为可选绑定,同时增加错误判断,只要任意一步失败就直接终止操作,不会触发崩溃。更推荐使用Firebase Storage自带的getData方法,避免单独拉取URL后再同步加载数据(同步加载会卡主线程),修改后的代码如下:
func downloadimages() { // 先判断当前登录用户是否存在,不存在直接返回 guard let uid = Auth.auth().currentUser?.uid else { return } // 已修正原代码路径多余的+号错误 let reference = Storage.storage().reference(withPath: "images/\(uid).jpg") // maxSize参数可根据你的图片大小调整,这里设置为最大1MB reference.getData(maxSize: 1 * 1024 * 1024) { data, error in // 有错误或者数据为空直接返回,不执行后续操作 guard let data = data, error == nil else { // 可按需在这里添加默认占位图逻辑:self.profileimage.image = UIImage(named: "default_avatar") return } // 数据转图片成功再赋值 self.profileimage.image = UIImage(data: data) } }
如果你需要保留原有的downloadURL写法,修改后版本如下:
func downloadimages() { guard let uid = Auth.auth().currentUser?.uid else { return } let reference = Storage.storage().reference(withPath: "images/\(uid).jpg") reference.downloadURL { (url, error) in // 判断无错误、url存在再继续执行 guard let url = url, error == nil else { return } // 异步拉取数据,避免同步方法阻塞主线程 DispatchQueue.global().async { do { let data = try Data(contentsOf: url) // 回主线程更新UI DispatchQueue.main.async { self.profileimage.image = UIImage(data: data) } } catch { // 拉取数据失败直接返回 return } } } }
内容的提问来源于stack exchange,提问作者newbycoder
相关产品推荐
相关产品推荐

