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. vue富文本编辑器TinyMec才是最好用的

    最近在做一个后台管理系统,系统中需要一个编辑器,没多想,百度查之,找了好些.如下: UEditor CKEditor 4 Vue-html5-editor wangeditor quill .... ...

  2. .NET 程序员的 Playground :LINQPad

    如果想执行一个简单的 C# 语句并获得运行结果,通常我们需要做几个步骤才能达成: 打开 Visual Studio 并新建一个控制台项目. 在 Program.cs 中编写代码并保存. 点击运行按钮或 ...

  3. 微信小程序前端与myeclipse的数据交换过程(SSH)

    这是我个人探究微信小程序前端与后端之间的数据交换的过程,再结合个人所学的SSH框架, 编程工具用myEclipse2014工具.当然,前提是后台的项目要部署到tomcat服务器上才行, 然后总结了从后 ...

  4. ABAP基础4:模块化

    子程序定义 以form开始,以endform结束,用perform语句调用,from语句可以在程序内部/外部,perform一定要写在前面 perform. from. 子程序模块 endform. ...

  5. 第几天?(hdu2005)

    第几天那个代码模板可以保存起来. #include<stdio.h> #include<math.h> #define PI 3.1415927 using namespace ...

  6. PHPstudy 修改数据库上传大小

    要修改的地方已经标出来了 直接修改为你需要的值即可:

  7. WordPress 设置图片的默认显示方式(尺寸/对齐方式/链接到)

    在文章中插入图片时,我们几乎每次都要设置图片的尺寸.对齐方式和链接方式,是比较耗时费力的.其实我们可以给这几个选项设置默认参数,省去我们每次设置的麻烦. 可以将下面的代码添加到主题的 function ...

  8. oracle 多表连接查询 join

    转 简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...

  9. MySQL性能分析(Explain)

    更多知识,请移步我的小破站:http://hellofriend.top 1. 概述 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.分析你的查 ...

  10. spring设计模式之applicationContext.getBean("beanName")思想

    1.背景 在实际开发中我们会经常遇到不同的业务类型对应不同的业务处理,而这个业务类型又是经常变动的; 比如说,我们在做支付业务的时候,可能刚开始需要实现支付宝支付和微信支付,那么代码逻辑可能如下 /* ...