(原文地址](http://wp.me/p7OxSd-5t)
iOS进阶系列之调优篇
上一篇文章iOS进阶系列之基础篇
讲到了 iOS 必备的技能。本文主要讲调优技能,iOS中调优可从以下方面:网络优化、界面流畅性、启动时间、代码解耦、持续集成、动态化。
网络优化
网络优化可以从以下几个方面着手:弱网环境、网络缓存、传输图片格式、网络安全。
- 根据用户所在的2G/3G/4G/Wi-Fi的网络环境来下发不同的配置,包括超时参数及图片大小;
- 增加网络重发机制;
- 增加 DNS映射及缓存,缓存中有 server的 ip 列表,该列表会有一定的机制去更新,也会有一定的机制去最优化排序,App 启动后,首次从缓存中取一个 ip 进行 tcp 连接,连接成功后会返回最适合用户的 server ip,同时该 ip 被加入到server ip 列表中优先使用;
- 设置网络优先级和依赖;
- 图片采用高性价比图片 webp 格式,更节省流量,在 webview 中使用需要配合 URLProtocol 使用;
- 请求头中增加ETag,必要时 server 返回304 Not Modifed, 配合Cache-Control在什么条件下可以缓存,缓存时间多长;
- 在本地以二进制缓存请求数据,缓存时机及清理机制;
- http连接配合 socket 连接使用,在高实时交互性页面里面采用 socket 连接;
- 防止 DNS 劫持,采用 https 连接,更进一步可以在URLProtocol中拦截异常的域名或者ip, AFN中安全策略里,使用验证域名,本地证书与 server 证书对比。
界面流畅性
均衡 CPU GPU,不要阻塞主线程。
- 对象延迟创建;
- 避免调整视力层次,添加移动视图;
- 对象特别多销毁时放到后台线程;
- 文本计算,文本绘制放到后台线程;
- 图片解码,在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片;
- 图像的绘制放到后台线程中,视图混合,把需要显示的图形在后台线程绘制为图片,避免使用圆角、阴影、遮罩等属性。
代码解耦
严格按照 MVC,也会有一定的解耦,如果页面复杂,可以用 MVVM,即 model--view--viewModel,这里的 model为瘦 model,view 即常见的 view, viewModel 为 view 中所需要的数据做一次封装。这里还缺少的一个为数据请求层,我们就叫 dataFetcher 吧,这样我们的架构是这样的:Controller 持有 dataFetcher、viewModel、view,dataFetcher负责拿到请求回来的原始数据,之后把数据传给 viewModel,viewModel 把数据加工成 view 所需要的数据后,再 bind 到 view 上。一个示例 Controller 可以是这样:
@implementation TestViewController
- (void)viewDidLoad {
_mineDataFetcher = [DMMineDataFetcher new];
@weakify_self
[self.mineDataFetcher requestMineDataWithCallback:^() {
@strongify_self
[self.mainView bindDataWithViewModel:[DMMineViewModel viewModelWithData:self.mineDataFetcher.allData]];
}];
}
这样职责分工清楚,Controller 中没有冗余代码,dataFetcher 就充当了 model 层中数据请求回来转化为 model,view 只负责显示,给我什么数据就显示什么,viewModel 就负责转化为 view 最适合的数据,比如:数据返回了一个余额长整形,单位为分,页面中要显示¥20.02元这样的字样,并且字体不一样,这种转化就交给 viewModel 吧。
(原文地址](http://wp.me/p7OxSd-5t)