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)wait
NS_AVAILABLE(10_6,
4_0);

添加block操作:
     - (void)addOperationWithBlock:(void
(^)(void))block
NS_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;
                          一旦执行操作,就会调用target的sel方法
                         注意:默认调用了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 = [NSBlockOperation
blockOperationWithBlock:^{
                    //任务代码
    }];
2、创建非主队列
            
NSOperationQueue *queue = [NSOperationQueue
mainQueue];
          3、添加操作到主队列
             [queue
addOperation:blockOp];
       方式二、NSBlockOperation + 非主队列
                     1、创建NSBlockOperation对象
           
NSBlockOperation *blockOp = [NSBlockOperation
blockOperationWithBlock:^{
                    //任务代码
    }];
2、创建非主队列
            
NSOperationQueue *queue = [[NSOperationQueue
alloc]
init];
          3、添加操作到非主队列
             [queue
addOperation: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、操作依赖
     [operationB
addDependency:operationA];
//
操作B依赖于操作A
         
          操做依赖:——线程同步技术
        [op2 addDependency op1];          
          不在同一个操作队列中的操作可以添加依赖!
                        
          注意:必须放在  添加操作队列之前;
                     忌:循环依赖;

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

iOS -NSOperation——高级的并发处理方法的更多相关文章

  1. iOS网络高级编程:iPhone和iPad的企业应用开发之错误处理

    本章内容 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWluZ2h1YXdlbmthbmc=/font/5a6L5L2T/fontsize/400/fi ...

  2. iOS -NSOperation并发编程

    http://www.cocoachina.com/game/20151201/14517.html http://blog.csdn.net/qinlicang/article/details/42 ...

  3. iOS NSOperation

    iOS NSOperation 一.简介 除了,NSThread和GCD实现多线程,配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOp ...

  4. iOS AFNetworking内存泄漏处理方法

    iOS AFN内存泄漏处理方法 细心的你是否也发现AFN的内存泄漏的问题了呢. 在这里给大家提供一个解决AFN内存泄漏的方法. 单例解决AFN内存泄漏 + (AFHTTPSessionManager ...

  5. IOS修改webView背景透明以及IOS调用前台js的方法

    工作上遇到IOS的webView中的H5页面需要透明以显示webView的背景颜色.用H5自身的透明度的css样式或者js控制背景颜色及透明度都打不到想要的效果,最后还是通过ios设置webView中 ...

  6. js 与ios 交互的三种方法

    第一种:IOS拦截url  实现跳转 参考链接:http://www.cnblogs.com/pengyingh/articles/2354381.html IOS9.0 及以上支持 第二种:IOS ...

  7. IOS 获取最新设备型号方法

    1.IOS 获取最新设备型号方法列表最新对照表:http://theiphonewiki.com/wiki/Models方法: #import "sys/utsname.h” struct ...

  8. 李洪强iOS开发Swift篇—10_方法

    李洪强iOS开发Swift篇—10_方法 一.简单说明 跟其他面向对象语言一样,Swift中的方法可以分为2大类: (1)实例方法(Instance Methods) 在OC中,实例方法以减号(-)开 ...

  9. iOS设备后台播放音乐方法

    iOS设备后台播放音乐方法 1 在设置Capabliites中打开Background Modes,选择Audio And AirPlay 2 在控制viewDidLoad中添加下面代码 AVAudi ...

随机推荐

  1. Docker学习笔记(三):Dockerfile及多步骤构建镜像

    Dockerfile指令 官方文档地址:https://docs.docker.com/engine/reference/builder/ Dockerfile是一个文本格式的配置文件,其内容包含众多 ...

  2. spark aggregate函数

    aggregate函数将每个分区里面的元素进行聚合,然后用combine函数将每个分区的结果和初始值(zeroValue)进行combine操作.这个函数最终返回的类型不需要和RDD中元素类型一致. ...

  3. 【雕爷学编程】MicroPython动手做(05)——零基础学MaixPy之LCD液晶屏

    配套 2.4寸LCD屏 ST7789驱动器芯片(24P 320X240) ST7789驱动器芯片2.4寸LCD屏(24P 320X240)主要参数 1. 模块名称:液晶显示模块2. 型号:KD024C ...

  4. F. Pathwalks动态开辟线段树

    题意:n点m边,然后要求走最多的路,走路的时候经过的边权必须是严格递增. 解法1:传统的区间更新 解法2:发现区间更新只是对两个固定的点所延长形成的区间段,所以问题可以退化成单点更新单点查询. 然后动 ...

  5. rfind()的使用

    今天学了一个新函数 rfind 使用: str=123/456 str.rfind('/',1,6) 返回的是从1到6找最后一个/的位置

  6. SimpleAuthenticationInfo的参数

    SimpleAuthenticationInfo的参数 仅供个人参考,以及学习记录.SimpleAuthenticationInfo authenticationInfo = new SimpleAu ...

  7. tomcat依赖--linux

    https://tomcat.apache.org/download-90.cgi 下载 3,解压到usr/locat/tomcat 创建usr/local/tomcat Mkdir /usr/loc ...

  8. MySQL/MariaDB随笔二

    mariaDB的二进制安装:系统版本和MariaDB版本 [root@ ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@ ~ ...

  9. Spring boot Sample 002之spring-boot-banner

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 学习Spring Boot Banner自定义的操作   三.步骤 3.1.点击File -> New Project ...

  10. Spring boot Sample 007之spring-boot-log4j2

    一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 spring boot 整合多环境log4j2 三.步骤 3.1.点击File -> New Project -> ...