iOS -NSOperation——高级的并发处理方法

来源:互联网 发布:linux 绝对路径 编辑:程序博客网 时间:2024/06/14 23:06
NSOperation是Objective-C中一种高级的并发处理方法,现在对GCD的封装;功能比GCD更强大!


两个概念
     操作;
     操作队列;
    
NSOperation多线程实现步骤
      实现多线程的步骤就是,把操作添加到操作队列中。


两个操作:NSInvocationOperation,NSBlockOperation
两个操作队列:主队列、非主队列;

队列:
队列的创建方法:
     主队列:
     NSOperationQueue *queue = [NSOperationQueuemainQueue];
     非主队列:
     NSOperationQueue *queue = [[NSOperationQueuealloc]init];

队列添加任务的方法三个
添加单个操作:
     - (void)addOperation:(NSOperation *)op;
添加多个操作:
     - (void)addOperations:(NSArray<NSOperation *> *)ops waitUntilFinished:(BOOL)waitNS_AVAILABLE(10_6,4_0);

添加block操作:
     - (void)addOperationWithBlock:(void (^)(void))blockNS_AVAILABLE(10_6,4_0);


操作:
     NSOperation是一个抽象类,也就是说NSOperation本身不具备封装操作的能力,需要使用它的两个子类:
  • NSInvocationOperation
  • NSBlockOperation

     操作:NSInvocationOperation
     
       方式一、NSInvocationOperation +strat方法    
                         1、创建NSInvocationOperation对象
               - (id)initWithTarget:(id)target selector:(SEL)selobject:(id)arg;
            2、调用start方法开始执行操作
               - (void)start;
                          一旦执行操作,就会调用targetsel方法
                         注意:默认调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步情况,执行操作;

      方式二、NSInvocationOperation +主队列   
                    1、创建NSInvocationOperation对象
              - (id)initWithTarget:(id)target selector:(SEL)selobject:(id)arg;
         2、创建主队列
               NSOperationQueue *queue = [NSOperationQueuemainQueue];     
          3、添加操作到主队列
               - (void)addOperation:(NSOperation *)op;

       方式三、NSInvocationOperation +非队列
                    1、创建NSInvocationOperation对象
              - (id)initWithTarget:(id)target selector:(SEL)selobject:(id)arg;
         2、创建非主队列
               NSOperationQueue *queue = [[NSOperationQueuealloc]init];
          3、添加操作到主队列
               - (void)addOperation:(NSOperation *)op;
      
     操作:NSBlockOperation
       方式一、NSBlockOperation +主队列
                      1、创建NSBlockOperation对象
           NSBlockOperation *blockOp = [NSBlockOperationblockOperationWithBlock:^{
                    //任务代码
    }];
2、创建非主队列
            NSOperationQueue *queue = [NSOperationQueuemainQueue];
          3、添加操作到主队列
             [queueaddOperation:blockOp];
       方式二、NSBlockOperation + 非主队列
                     1、创建NSBlockOperation对象
           NSBlockOperation *blockOp = [NSBlockOperationblockOperationWithBlock:^{
                    //任务代码
    }];
2、创建主队列
            NSOperationQueue *queue = [[NSOperationQueuealloc]init];
          3、添加操作到主队列
             [queueaddOperation:blockOp];

追加操作:
- (void)addExecutionBlock:(void (^)(void))block;


NSOperationQueue管理
     1、最大并发数(同时执行的任务数
     方法:
          最大并发数的相关方法
     - (NSInteger)maxConcurrentOperationCount;
     - (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

  2、队列的取消、暂停、恢复
  • 取消队列的所有操作
     - (void)cancelAllOperations;
          提示:也可以调用NSOperation- (void)cancel方法取消单个操作

  • 暂停和恢复队列
     - (void)setSuspended:(BOOL)b;// YES代表暂停队列,NO代表恢复队列
     - (BOOL)isSuspended;
     3、操作依赖
     [operationBaddDependency:operationA];// 操作B依赖于操作A
         
          操做依赖:——线程同步技术
        [op2 addDependency op1];          
          不在同一个操作队列中的操作可以添加依赖!
                        
          注意:必须放在  添加操作队列之前;
                     忌:循环依赖;

自定义NSOperation
     将操作添加到队列中的时候,会调用main方法;
     - (void)main方法,在里面实现想执行的任务;
     自定义NSOperation的时,只需要重写main方法即可;
     
0 0
原创粉丝点击