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容器与系统时间同步最佳方法

    前言:在Docker容器创建好之后,可能会发现容器时间跟宿主机时间不一致,此时需要同步它们的时间,让容器时间跟宿主机时间保持一致. 一.分析时间不一致的原因 宿主机采用了CST时区,CST应该是指(C ...

  2. [tgpl]go匿名函数

    [tgpl]go匿名函数 0. 定义 匿名函数顾名思义是没有名字的函数, Named functions can be declared only at the package level, but ...

  3. ssh别名登录,非常适合从跳板机登录其他主机

    一般连主机会是这样的: ssh admin@IP 端口变了的话还要加上端口号 ssh admin@IP -p 10022 可以用ssh别名简化这个操作: vim .ssh/config 想要全局生效的 ...

  4. 「雕爷学编程」Arduino动手做(7)——旋转电位器模块

    37款传感器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备逐一做做实验 ...

  5. vue在钩子中引用方法不成功

    在组建创建成功后调用methods里的方法fn1,失败,提示not a function: created(){ getData(){} } solution: created(){ this.get ...

  6. class.getFields和class.getDeclareFields的区别

    class.getFields的定义 返回类提供的public域包括超类的共有变量; 注: 是public,我们平时定义变量一般用的private,如果用getFields是不会获得. class.g ...

  7. poj3687拓扑排序

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14749   Accepted: 4325 D ...

  8. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)

    上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...

  9. layui加tp5图片上传实例

    <div class="layui-fluid"> <div class="layui-row"> <form class=&qu ...

  10. Thinkphp5 post提交模糊查询带分页如何保留参数

    最近做了一个分页的模糊查询post请求,发现查出来的分页点击下一页导致所有的搜索条件被重置,分页效果就失效了. 以下是网上部分解决办法: 控制器代码 public function index($na ...