NSOperation基于GCD,NSOperation是iOS2的时候出来的,GCD在iOS4的时候出来的.iOS4的时候NSOperation重写了 新增了NSBlockOperation.
NSOperation是抽象类不能直接使用,要使用的话,就使用它的子类
a.NSInvocationOperation b.NSBlockOperation c.自定义NSOperation.
NSOperation 可以手动开启
调用对象方法
- (void)start;
如果是加入到队列中的操作 就不能再调用start方法 会导致系统崩溃
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSOperationQueue addOperations:waitUntilFinished:]: 1 (of 3) operation is finished, executing, or already in
a queue, and cannot be enqueued'
监听操作完成
//当前操作完成时调用的block
@property
(nullable,
copy)
void
(^completionBlock)(void)
NS_AVAILABLE(10_6, 4_0);
操作依赖
// 添加依赖 a addDependency:b a要等到b执行完之后再执行
//注意点:不要添加循环依赖 会造成卡死
// 可以在同一个队列中的操作添加依赖 也可以在不同的队列中的操作添加依赖
- (void)addDependency:(NSOperation
*)op;
//移除依赖
- (void)removeDependency:(NSOperation
*)op;
1.队列 (NSOperationQueue)(除了主队列)本质是一个并发队列
属性:
//队列中的所有操作
@property
(readonly,
copy)
NSArray<__kindof
NSOperation
*> *operations;
//队列中操作个数
@property
(readonly)
NSUInteger
operationCount
NS_AVAILABLE(10_6, 4_0);
//队列的最大并发数即 当前队列中同时执行的操作的最大数量 (如果设置为0,那么该队列就是一个串行队列)
@property
NSInteger
maxConcurrentOperationCount;
//赋值为true 还没有执行的操作暂停执行 false继续未执行的操作
@property
(getter=isSuspended)
BOOL
suspended;
//队列名字
//队列名字
@property
(nullable,
copy)
NSString
*name
NS_AVAILABLE(10_6, 4_0);
//服务质量 即 队列优先级
NSQualityOfServiceUserInteractive = 0x21,
NSQualityOfServiceUserInitiated = 0x19,
NSQualityOfServiceUtility = 0x11,
NSQualityOfServiceBackground = 0x09,
NSQualityOfServiceDefault = -1
@property
NSQualityOfService
qualityOfService
NS_AVAILABLE(10_10, 8_0);
使用[[NSOperationQueue
alloc]
init] 创建一个队列对象
类方法
//可以获得主队列
+ (NSOperationQueue
*)mainQueue
NS_AVAILABLE(10_6, 4_0);
对象方法
//添加一个操作到队列中
- (void)addOperation:(NSOperation
*)op;
//添加多个操作到队列中 waitUntilFinished : 是否等待所有操作完成在执行之后的代码
- (void)addOperations:(NSArray<NSOperation
*> *)ops waitUntilFinished:(BOOL)wait
NS_AVAILABLE(10_6, 4_0);
//添加block操作
//添加block操作
- (void)addOperationWithBlock:(void
(^)(void))block
NS_AVAILABLE(10_6, 4_0);
1.NSInvocationOperation
使用方法类似于NSThread
- (nullableinstancetype)initWithTarget:(id)target
selector:(SEL)sel object:(nullableid)arg;
2.NSBlockOperation
//类方法 创建一个block操作
+ (instancetype)blockOperationWithBlock:(void
(^)(void))block;
//执行块:可以给一个操作添加多个要做的事情 异步操作
- (void)addExecutionBlock:(void
(^)(void))block;
@property
(readonly,
copy)
NSArray<void
(^)(void)> *executionBlocks;
3.自定义操作
创建一个继承自NSOperation的类 实现方法:
- (void)main;
操作本质上被添加到队列中,本质就是执行main 这个方法不是程序员主动去触发