NSOperation及其子类简单介绍和使用

来源:互联网 发布:tk免费域名注册网站 编辑:程序博客网 时间:2024/04/29 05:19
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<__kindofNSOperation*> *operations;
//队列中操作个数
@property(readonly)NSUIntegeroperationCount NS_AVAILABLE(10_6, 4_0);
//队列的最大并发数即 当前队列中同时执行的操作的最大数量  (如果设置为0,那么该队列就是一个串行队列) 
@propertyNSIntegermaxConcurrentOperationCount;
//赋值为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
@propertyNSQualityOfServicequalityOfService NS_AVAILABLE(10_10, 8_0);

使用[[NSOperationQueuealloc]init] 创建一个队列对象
类方法
//可以获得主队列
+ (NSOperationQueue*)mainQueue NS_AVAILABLE(10_6, 4_0);
对象方法
//添加一个操作到队列中
- (void)addOperation:(NSOperation*)op;
//添加多个操作到队列中  waitUntilFinished : 是否等待所有操作完成在执行之后的代码
- (void)addOperations:(NSArray<NSOperation*> *)ops waitUntilFinished:(BOOL)waitNS_AVAILABLE(10_6, 4_0);
//添加block操作
- (void)addOperationWithBlock:(void(^)(void))blockNS_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 这个方法不是程序员主动去触发

0 0
原创粉丝点击