LESSON 22 / 576 分钟
URLSession、Codable 与请求状态
一个真实请求至少包含加载、成功、空数据和失败,不只是 decode 成功的那条路径。
用你的前端经验理解
URLSession 类似 fetch;Codable 把数据和 Swift 类型映射。但可编译的模型不意味着服务端永远按这个结构返回。
01 / 理解问题
为什么需要它
网络调用是一条由多个可失败阶段组成的流水线:构造请求、传输、检查 HTTP、解码、映射业务模型、更新状态。URLSession 成功返回 Data,只能说明获得了响应,不代表 HTTP 状态成功,更不代表 JSON 符合你的模型。把这些层分开,错误提示与重试策略才不会混乱。
它是怎样工作的
Codable 按类型结构编解码数据,字段名、可选性与日期策略都必须匹配协议。接口 DTO 可以与页面模型分离,让后台字段变化不直接扩散到 UI。加载状态至少区分等待、成功空数据、成功有数据和失败;刷新已有内容时,也可以保留旧结果并单独显示刷新状态。
02 / 掌握要点
把关键概念连起来
1
请求
使用 URLRequest 配置方法、header 和 body;检查 HTTPURLResponse 状态码,再解码响应。
2
解码
Decodable 用于读取,Encodable 用于写出。处理 snake_case、日期格式与可能缺失的字段。
3
状态
支持取消、失败重试和合理超时;取消不一定要作为错误弹给用户。将网络依赖与 UI 分开。
READ THE CODE
Swift · 示例片段
struct ArticleDTO: Decodable { let id: String let title: String}// URLSession 返回后先校验 HTTP 状态,再调用:// let rows = try JSONDecoder().decode([ArticleDTO].self, from: data)- 示例只展示数据形状,不省略状态检查的必要性。
用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。
03 / 案例推演
加载阅读列表的失败分层
- 先检查 URL 和请求参数,再用 URLSession 等待响应;取消需要按取消处理,不弹出网络故障提示。
- 检查 HTTPURLResponse.statusCode。401 进入会话处理,服务器错误允许适当重试,非成功响应不要硬解码成文章列表。
- 使用 JSONDecoder 转成 DTO,再映射成领域模型,最后在正确隔离域更新界面。
这里需要你亲自判断
网络成功返回数据不代表 HTTP 业务成功;不要在客户端内嵌服务端私钥。
04 / 动手验证
做一个小练习
用 mock 数据覆盖:成功、空列表、401、500、断网和非法 JSON。
- 准备成功列表、空数组、401 和字段类型错误四种固定响应。
- 给每种响应规定用户看到的页面,并说明是否应该自动重试。
展开参考思路与验收标准
空数组是成功;401 不是 JSON 解析失败;字段类型不符需要检查接口契约。重试可能重复写操作,因此创建记录等请求必须考虑幂等性。
05 / 检查理解
URLSession 返回 data 后可以直接认为请求成功吗?
答对理解题后即可标记完成