这是我参与「第四届青训营 」笔记创作活动的第4天
进程
RunLoop
RunLoop是事件接受和分发机制的一个实现,可以让线程在适当的时间处理任务不会退出iOS App中,主线程的RunLoop在程序运行时就会启动,其他线程的RunLoop需要手动启动
- 主线程
- iOS App启动时会默认开启一条线程,称为主线程,用于描绘UI界面和处理UI交互事件,又称UI线程
- 耗时操作会妨碍主线程中的执行,会引起App卡顿
多线程
-
优点
- 提高程序执行效率
- 提高资源利用率
-
缺点
- 创建线程、线程调度多有开销成本,大量线程会影响程序性能
- 线程的安全问题
-
POSIX Thread
- 类UNIX系统通用的对线程API
- 跨平台/可移植
- C语言接口
- 程序员管理线程生命周期
-
NSThread
- 苹果官方提供的面向对象API
- OC接口,可以通过KVO监听部分属性
- 程序员管理线程生命周期
-
GCD(Grand Central Dispatch)
- 自动使用更多CPU内核
- 自动管理线程的生命周期
- 提供了易于使用的并发模型
- 无需多余的线程管理任务
-
NSOperation 基于GCD的多线程编程
- OC接口,面向对象
- 可指定任务之间的依赖关系,控制执行顺序
- 支持设定任务并发数
- 支持取消任务,可用于KVO监听任务状态
同步执行异步执行
| 并发队列 | 串行队列 | 主队列 | |
|---|---|---|---|
| 同步执行(dispatch_sync) | 不开启新线程,在当前线程串行执行任务 | 不开启新线程,在当前线程串行执行任务 | 发生死锁 |
| 异步执行(dispatch_async) | 会开启新线程,并发执行任务 | 开启一条新线程,串行执行任务 | 不开启新线程,在当前线程的下一个runloop执行任务 |
- dispatch_after
- 在指定时间点之后执行某个任务
- dispatch_group
- 执行完Dispatch Queue中所有任务后再执行某个任务
- dispatch_group_wait可以设置等待group执行的时间上限
- dispatch_apply
- 按照指定的次数将指定的任务追加到派分队列,并等待队列中全部任务执行结束
- dispatch_once
- 某个操作在应用程序生命周期只执行一次
线程安全
- atomic
- 对属性getter、setter调用是线程安全的
- 需要耗费资源为属性加锁
- nonatomic
- 访问不是线程安全的
- 访问效率比atomic更高
应用
- 从网络加载图片
- 一个页面有多个请求,需要全部请求都返回的时候刷新界面
- 实现一个线程安全的容器类