架构
错误往上交,不要就地弹窗
网络层返回错误值。要不要提示、提示成什么样,由当前界面决定。
请求失败时在网络封装里直接 present 一个 alert,调用方失去控制。列表页想保留旧数据并显示一条横幅,设置页想把错误写在按钮下面,两边都被同一个弹窗绑死。
分层
- 传输层把状态码和取消变成明确的错误,不碰界面。
- 功能层决定这个错误对当前状态意味着什么:失败、可重试、需要登录。
- 界面只读状态,选择横幅、空页或提示。
enum RequestError: Error {
case cancelled
case unauthorized
case failed(message: String)
}
extension FeedState {
mutating func send(_ event: FeedEvent) {
switch event {
case .failed(RequestError.cancelled):
break
case .failed(RequestError.unauthorized):
phase = .failed(message: "需要重新登录")
case .failed(RequestError.failed(let message)):
phase = .failed(message: message)
default:
break
}
}
}
取消不是失败。用户离开页面导致的取消,不要记成一次错误上报,也不要弹“网络异常”。
文案放在功能层或界面层,不要放在 URLSession 的封装里。同一条 500,在支付和在拉配置里,该说的话不一样。