SwiftUI使用async/await调用Unsplash API出现Failed to fetch image报错如何解决
问题原因及修复方案
核心问题点
- JSONDecoder未配置日期解码策略:Unsplash API返回的日期为ISO8601格式,当前使用默认配置的JSONDecoder无法解析
UnsplashData中定义的Date类型属性,直接触发解码失败进入catch块 - 错误排查不充分:catch块仅打印固定提示,未输出实际错误信息,无法快速定位问题根因
- 冗余异步嵌套:
.task修饰符本身已经提供了异步执行上下文,内部嵌套async块属于多余操作,没有实际作用还可能打乱任务执行层级 - 存在多处强制解包:代码中
requestURL!、unsplashData?.urls!.raw!等写法存在崩溃风险
修复代码示例
1. 修正getURL方法
func getURL() async { // 先判空避免强制解包崩溃 guard let requestURL = requestURL else { return } do { let (data, _) = try await URLSession.shared.data(from: requestURL) let decoder = JSONDecoder() // 配置日期解码策略适配Unsplash的ISO8601格式日期 decoder.dateDecodingStrategy = .iso8601 unsplashData = try decoder.decode(UnsplashData.self, from: data) } catch { // 打印实际错误方便后续排查 print("图片请求失败:\(error)") } }
2. 优化AsyncImage调用,移除不安全强制解包
AsyncImage(url: unsplashData?.urls?.raw.flatMap(URL.init) ?? URL(string: "https://images.unsplash.com/photo-1626643590239-4d5051bafbcc?ixid=MnwxOTUzMTJ8MHwxfHJhbmRvbXx8fHx8fHx8fDE2MjY5Njc0MjI&ixlib=rb-1.2.1")!) .aspectRatio(contentMode: .fit)
3. 移除冗余的async嵌套
直接保留原本的task写法即可,不需要嵌套async块:
.task { await getURL() }
内容的提问来源于stack exchange,提问作者Arnav Motwani
相关产品推荐
相关产品推荐

