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. 五一以来,国产手机受到cmtwg, nkvhu, qhsz等几款恶意软件肆虐。

    受影响手机包括魅族,中国移动等国产手机. 5月12日开始有人在百度知道提问cmtwg,5月13日mx吧也有人在发贴. 我接到有问题的手机时间更早,大约就是五一之后. 出现问题的几个牌子的国产手机,似乎 ...

  2. python mysql数据库基本操作方法

    实现:使用Python实现用户登录,如果用户存在(数据库表中存在)则登录成功(假设该用户已在数据库中) import pymysql username = input('输入用户名:').strip( ...

  3. 【Net】CEF浏览IISExpress运行Web项目

    前言 本文介绍在Winform桌面应用中,使用IISExpress做Host主机,启动.Net平台的Web项目. 浏览Web网页使用CEF开源组件. 准备 首先创建Winform项目WinFormII ...

  4. phantomJS安装出错解决办法

    解决办法:https://github.com/xhlwill/blog/issues/11

  5. 微信小程序中,如何阻止多次点击单击事件

    在微信小程序中,有自制对话框用于提交数据,但是会出现用户连续点击,多次提交数据的情况. //.wxml <view class="acertain" bindtap=&quo ...

  6. MySQL 数据库的基本使用

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,而MySQL AB 公司被 Oracle 公司收购,故 MySQL 现在属于 Oracle 公司.MySQL 是一种关联数据 ...

  7. HDU2825AC自动机+状压

    //我感觉这题不如叫你不看代码就不知道题干在说啥,强烈吐槽 Liyuan lives in a old apartment. One day, he suddenly found that there ...

  8. Kattis - entertainmentbox

    题目链接:https://vjudge.net/problem/Kattis-entertainmentbox 题目大意: 一种叫做不知道什么的盒子可以同时录 k 个节目,现给出 n 个节目的开始和结 ...

  9. 【Redis】String应用场景

    单值缓存 SET key value GET key 对象缓存 SET user: value(json格式数据) MSET user::name value1 user::balance value ...

  10. JavaScript的流程控制语句以及函数

    一.流程控制 1. 作用:控制代码的执行顺序 2. 分类 2.1顺序结构:从上到下依次执行代码语句 2.2选择结构: 1. if语句 简单if结构 if(条件表达式){ 表达式成立时执行的代码段 } ...