NSOperation
2016-04-21 本文已影响393人
Iris_Fighting
NSOperation简介
- 是OC语言中基于GCD的面向对象的封装
- 使用起俩比GCD更加简单
- 提供了一些用GCD不好实现的功能
- 苹果推荐使用,使用NSOperation不用关心线程以及线程的生命周期问题
- NSOperation是一个抽象类,不能直接使用(方法没有实现)
- 约束子类都有共同的属性和方法
- NSOperation的子类
1.NSInvocationOperation 2.NSBlockOperation 3.自定义operation
- NSOperationQueue队列
使用步骤
NSOperation和 NSOperationQueue是实现多线程的具体步骤:
1.先将需要执行的操作封装到一个NSOperation对象汇总
2.将NSOperation对象添加到NSOperationQueue中
系统会自动将NSOperationQueue中的NSOperation取出来
将去出来的NSOperation封装的操作放在一条新线程中执行
PS:队列先进先出
NSInvocationOperation
NSBlockOperation
自定义operation
NSOperationQueue
1.NSOperationQueue的作用:NSOperation可以调用start方法来执行任务,但默认是同步执行.如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作.
2.添加到NSOperationQueue中
- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block NS_AVAILABLE(10_6, 4_0);
- (void)addOperations:(NSArray<NSOperation *> *)ops waitUntilFinished:(BOOL)wait NS_AVAILABLE(10_6, 4_0);
线程间通讯
1.主队列
- 添加到主队列的操作,最终都执行在主线程
-
[NSOperationQueue currentQueue];
2.当前队列 - 获取当前操作所在的队列
[NSOperationQueue mainQueue];
GCD VS NSOperation
- GCD是iOS4推出的,主要针对多核CPU做了优化,C语言技术
- GCD是将任务(block)添加到队列中(串行/并行/全局/主队列),并且以同步/异步的方式执行任务的函数
- GCD提供了一些NSOperation不具备的功能
- 一次性执行
- 延时执行
- 调度组
- NSOperation
- NSOperation是iOS2.0推出的,iOS4之后重写了NSOperation
- NSOperation是将操作(异步的任务)添加到队列(并发队列),就会执行指定的操作函数
- NSOperation提供方便操作
- 最大并发数
- 队列中的暂停/继续
- 取消所有的操作
- 指定操作之间的依赖关系(GCD中可以用同步实现)
队列的最大并发数:
- 同时执行的任务数量,比如同时开3个线程执行3个任务,并发数就是3
- 相关方法:
@property NSInteger maxConcurrentOperationCount;
例子
NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue setMaxConcurrentOperationCount:8]; queue.maxConcurrentOperationCount = 8;
队列的暂停/取消/恢复:
- 取消队列的所有操作:
- (void)cancelAllOperations;
- 暂停和恢复队列的操作
@property (getter=isSuspended) BOOL suspended;
YES代表队列暂停,NO代表恢复队列
暂停是当前正在执行的操作会继续执行下去,暂停后续的操作,取消原理也是如此.
优先级与服务质量
- 设置NSOperation在queue中的优先级,可以改变操作的执行优先级
typedef NS_ENUM(NSInteger, NSOperationQueuePriority) { NSOperationQueuePriorityVeryLow = -8L, NSOperationQueuePriorityLow = -4L, NSOperationQueuePriorityNormal = 0, NSOperationQueuePriorityHigh = 4, NSOperationQueuePriorityVeryHigh = 8 }; @property NSOperationQueuePriority queuePriority;
- iOS8以后推荐使用qualityOfService