性能
首屏慢,先画请求瀑布
一个页面串行打四五个接口,用户等到的是最后一条的尾巴,不是你本地解析有多快。
界面逻辑已经很干净,首屏仍要两秒。用网络仪器看瀑布:是不是进页面才发请求,后一个请求要等前一个的 id,图片又排在数据之后。本地解析省下的 20 毫秒,盖不住这一串等待。
能并行的不要串
没有依赖的请求一起发。有依赖的,把关键路径缩到最短:首屏必须的字段先回来,评论、推荐、红点下一帧再要。不要为了“接口少”把一个大接口做成必须全成功才能渲染。
func loadHome() async throws -> Home {
async let profile = api.profile()
async let feed = api.feed(page: 1)
return Home(profile: try await profile, feed: try await feed)
}
async let 会并行开始。其中一个失败时,记得取消另一个,不要让无用请求继续占连接。URLSession 的超时和重试要有上限,无限重试会把首屏卡死在转圈上。
缓存是界面策略
- 有上次的列表,就先画上次的,同时刷新。不要先空白再等网络。
- 缓存要有代际。用户一切换账号,旧缓存不能闪一下。
- 图片走独立缓存。列表 JSON 里只放地址和尺寸,不要把原图嵌进接口。
度量用首屏可用时间:从进入页面到第一条内容画出来,再记到图片稳定。两个数分开。只记接口耗时,会漏掉你在主线程上拼模型和排版的时间。