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操作
- (void)addOperationWithBlock:(void (^)(void))block NS_AVAILABLE(10_6, 4_0);
1.NSInvocationOperation
使用方法类似于NSThread
- (
nullable
instancetype
)initWithTarget:(
id
)target selector:(
SEL
)sel object:(
nullable
id
)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 这个方法不是程序员主动去触发