1、断点续传
断点续传的原理:每次在向服务器请求下载数据的同时,要告诉服务器是从整个下载文件的数据流的某个位置开始下载,然后服务器就返回从那个位置开始的数据流。
//创建请求对象---关键点
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//设置请求头信息,说明只需要请求该次源的一部分数据
/*
bytes = 0-1000 表示下载0~1000的数据
bytes = 0- 表示从0开始下载直到下载完毕
bytes = 100- 表示从100开始下载直到下载完毕
*/
NSString *range = [NSString stringWithFormat:@"bytes=%zd-",self.currentSize];
[request setValue:range forHTTPHeaderField:@"Range”];
2、IOS缓存策略
缓存的本质是用空间换取时间
NSURLCache是iOS系统提供的内存以及磁盘的综合缓存机制,NSURLCache对象被存储沙盒中Library/cache目录下。
AFNetworking中AFImageDownloader使用AFAutoPurgingImageCache和NSURLCache管理图片缓存。
3、UITableView载优化
cell的复用:
cell的高度:提前计算高度
cell的渲染:渲染最好时的操作之一就是混合(blending)了,所以我们不要使用透明背景,将cell的opaque值设为Yes,背景色不要使用clearColor,尽量不要使用阴影渐变等;减少subviews的个数和层级;避免CALayer特效(shadowPath):不要给cell动态添加subView,在初始化cell的时候就将所有需要展示的添加完毕,然后根据需要来设置hide属性显示和隐藏。
异步化UI,不要阻塞主线程.
滑动时按需加载对应的内容
4、网络优化
最小化应用使用的专有域名的数量
如果子域名数量上升至两位数,我们需要仔细考虑这方面的优化了
DNS预先下载
SSL握手时间
如果应用中所有连接均是通过 TLS/SSL 的(使用HTTPS)
最大程度减少应用发起的连接数,也需要减少应用连接的独有域名的数量
请求结束后不要关闭 HTTP/S 连接
为所有的 HTTP/S 的请求添加头 Connection: keep-alive
如果适用,当网络可用时,支持同步的离线存储
5、IOS-Runtime
动态交换两个方法的实现
动态添加方法
动态添加属性
6、IOS-Runloop
RunLoop是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行;而且在没有事件处理的时候,会进入睡眠模式,从而节省CPU资源,提高程序性能。
什么时候使用run loop
仅当在为你的程序创建辅助线程的时候,你才需要显式运行一个run loop。
对于辅助线程,你需要判断一个run loop是否是必须的。如果是必须的,那么你要自己配置并启动它。你不需要在任何情况下都去启动一个线程的run loop。
例如:使用端口或自定义输入源来和其他线程通信;使用线程的定时器;Cocoa中使用任何performSelector…的方法;使线程周期性工作。
如果你决定在程序中使用run loop,那么它的配置和启动都很简单。和所有线程编程一样,你需要计划好在辅助线程退出线程的情形。让线程自然退出往往比强制关闭它更好。
7、iOS热更新实现方式
1、JSPatch:热更新时,从服务器拉去js脚本,理论上可以修改和新建所有的模块,但是不建议这样做,用来做紧急的小需求和 修复严重的线上bug。
2、lua脚本:从服务器拉去lua脚本,游戏开发经常用到。
3、Weex:跨平台,weex基于vue.js,weex是阿里开源的技术。
4、React Native:不像Weex能一套代码多端运行,适配iOS和android需要自己分别做修改。React Native和Weex都 可以进行热更新,但都不能修改原生OC代码。JSPatch、lua 配合React Native可以让一个原生APP时刻处于可扩展可修改的状态。
5、Hybrid:像PhoneGap之类的框架, 基本概念和web差不多, 通过更新js/html来实现动态化,没有原生的效果流畅。
6、rollout.io:Rollout紧急修复线上bug。后端有相关的管理页面,要翻墙才能使用。
7、DynamicCocoa:滴滴iOS的一个框架,与JSPatch比更加智能化,用OC在XCode中写完代码,用工具可以自动生成可以更新的js文件。