困扰一个多月的bug 终于解决了,感觉整个人都升华了,一个字爽。这里单章记录下。
当然在此特别鸣谢 -- 我的的小伙伴yuki 两个人都在坑里待了好久好久。。
bug的前世今生
需求: 类似微信朋友圈动态,里面涉及到动态内容, 动态九宫格,评论展示
复现: 加载多条带有多张图片的动态 造成crash
fix 的各种姿势
- SDWebImage的问题 memory暴涨 耗电量very high disk读写操作频繁
- YYWebImage的问题 cpu超负荷 占比20多 耗电量very high disk读写操作频
- TableViewCell 复用问题 更改布局方式 xib与纯代码
- 行高缓存的问题 第一次加载Cpu大量计算 NSCache 作为 cache storage 动态id作为cache key 。产生新数据如评论重新计算替换原有行高。也用过相关第三方FDTempleteCell
- 滚动结束时候,实现scrollView的代理方法,加载数据 但是可能体验并不友好,会出现空白 以及过多的占位图片
- 按需加载,未实现,思路简单说就是加载滚动结束index 前后x条数据
- 圆角处理, 在Layer上操作 避免GPU损耗 离屏渲染
- 预估行高 iOS8出现的动态行高计算 一般不是太复杂的页面足够用了
- 加载下一页数据的时候清空SDWebImage的Cache 停止所有download cache任务
- 控制Cache的大小 图片缓存限制xx张数 控制最大异步并发数量(当时考虑到可能多条线程开销过大导致性能损耗)
当!当!当! bingo ! pabo!
- 代码能做的优化还是有限的
- 下载charles 抓数据看看图片大小
- 不看不知道 一看一条动态(9张图片)居然有10M多 手动滑稽
- 原来真相只有一个:我们加载是原图(大图) 哈哈哈。。。。咳。。 咳。。。。
- 后台返回缩略图用于列表展示 大图用于照片查看器查看
Alright! The bug was finally fixed.
后记:
- 基础不扎实, 定位问题能力有待加强
- 当初就考虑到抓包看看, 最后钻牛角尖一直是以为代码问题
- When you have eliminated the impossibles,whatever remains,however improbable,must be the truth. Yes, fact only one.