问题1: NSOperation执行多线程优点或相比GCD优势是什么
NSOperration
基于cocoa框架
实现, 底层是GCD
, 相当于基于GCD
封装的对象。
-
GCD
是无法取消
队列中的任务的, 而NSOperation
则取消未运行任务 -
NSOperation
可随意调配任务执行顺序,GCD
比较繁琐 -
NSOperation
任务支持KVO监听, 可方便监听任务状态(开始/执行中/结束), 而GCD
不支持 -
NSOperation
可设置同一队伍优先级, 也可设置并发任务执行顺序。GCD
只能设置不同队列的执行优先级 -
NSOperationQueue
支持设置最大并发数, 而GCD
不支持 -
NSOperation
支持自定义, 封装比较繁琐代码, 提高复用性
问题2: 我们可以控制NSOperation哪些状态
-
isReady
: 当前任务是否处于就绪状态 -
isExecuting
: 当前任务是否处在正在进行中 -
isFinished
: 当前任务是否已完成 -
isCancelled
: 当前任务是否已取消
同时关于状态控制
- 如果只重写
main
方法, 底层控制变更任务执行完成状态以及任务退出 - 如果重写
start
方法, 自行控制任务状态
问题3: 系统是怎样移除一个isFinished=YES的NSOperation的?
答案:
通过KVO
系统通过KVO
方式来移除operationqueue
中对应operation
来达到, 正常销毁operation
对象
如果追问KVO实现原理见: IOS面试题(类相关) --- KVO