1. 术语
同步和异步
在同步队列里的任务,下一个任务会在当前任务 执行完成之后 再执行。
在异步队列里的任务,下一个任务会在当前任务 开始之后 就执行。
同步任务会阻塞当前的Run Loop,而异步的不会。
串行和并发队列
队列本身相当于是一个任务管理列表,里面管理着不同的任务
任务提交到的队列还具有串行或并发的特征。
串行队列 只有一个 与之关联的线程,因此仅允许在任何给定时间执行单个任务。
并发队列能够利用 系统拥有资源的线程数 , 将根据需要在并发队列上创建和释放线程。
注意 ⚠️:并发队列不能保证一次运行多个任务。 如果程序当前资源紧张,也可能只能执行一项任务
小结
同步和异步的却别在于是否会等待当前任务完成再开始下一个任务
串行和并发的区别在于是否有多少线程可供调用
2. Grand Central Dispatch
GCD(Grand Central Dispatch)是Apple对C的libdispatch
库的实现。它用先进先出(FIFO)队列来管理用户任务,然后分配到对应的完全由系统管理的线程上。
具体的任务分配到哪个线程上是无法确定的(除了特殊的主线程任务)
3. Operation
如果任务之用运行一次那么GCD非常会合适,但如果有可以重用的任务需要封装,或者需要对任务状态追踪更改,取消任务,那么Operation会更加得心应手。
通过写一个继承于Operation的子类,来封装。
Operation主要的特点是有不同的任务状态
- isReady // 准备就绪
- isExecuting // 正在执行
- isCancelled // 被取消
- isFinished // 已完成
Operation不像GCD,它默认是同步的,
Block Operation
如果想要方便的像GCD调用闭包一样使用Operation。
BlockOperation
也是Operation的子类,在默认在异步在全局队列中执行。如果需要同步运行的话,需要设置队列。
4. 该用哪一个?
如果只是执行简单任务的话,GCD显然更方便快捷。
但是需要有跟踪任务状态,并且取消任务的话,Operation则会提供
GCD | Operation | |
---|---|---|
推出时间 | iOS 4.0 | iOS 2.0(4.0之后重构) |
任务方式 | 闭包 | 子类、闭包 |
取消 | 复杂 | 简单 |
依赖关系 | 复杂 | 简单 |
5. 习题
向一个异步串行队列加入三个任务和一个异步并发队列加入三个任务结果有什么区别?
系列文章链接
网友评论