You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 09:24:03