三种多线程方式
NSThread:基本不用
GCD:
原理:先创建一个队列 把操作(任务)加载里面
队列:串行/并行
任务:同步异步
串行异步非常常用(类似于排队走, 最安全的线程) 用于下载图片
并行异步(并排跑 类似于赛跑) 执行顺序程序员不能控制
串行同步 队列同步任务同样会在主线程上运行(不用)
并行同步 不需要创建子线程
串行队列既可以保证效率 (新建一个子线程) 又能够实现并发
并行队列容易出错 执行顺序程序员不能控制
同步任务一般用来阻塞任务(如登录)
gcd全局队列
与并行的区别:
- 全局队列不需要创建 直接get就能用
- 执行效果 与两个队列的执行效果一样
- 全局队列没有名称 调试时无法确定准确队列
gcd主线程队列(保证操作在主线程运行)
每一个程序只有一个主线程(所有iOS开发中 UI操作 都必须在主线程上执行)
异步任务 在主线程运行 同时也是保持队形的
同步任务 会阻塞 因为主线程一直在工作 一直在执行任务 同步的任务永远不会被执行
NSOperationQueue:
两个队列:主队列/自定义队列
原理:定义一个操作 加入到队列中
开多少线程 由系统决定
GCD 是串行队列,异步执行,只会开一个线程
NSOperationQueue:
- 可以设定执行顺序 用addDependency 可能会开多个线程 但是不会开太多
- 依赖关系 可以跨队列
- 可以设置最大并发数(在设定最大并发数时,如果前一个线程工作完成 但是没有销毁会新建线程)
应用场景:网络开发中,下载工作
NSBlockOperation:
NSInvocationOP:
需要定义一个方法 能接受一个参数 使用不够灵活
注:所有自定义队列,都是在子线程中运行