NSInvocationOperation

// 基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类

NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
   
    // 如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情
    [op setCompletionBlock:^{
        NSLog(@"完成");
    }];
   
    //    2.开始执行任务(同步执行)
   
    // 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。

[op start];

NSBlockOperation

//  能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成
    NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@",[NSThread currentThread]);
        
        NSLog(@"第一个操作");
    }];
    
    // 通过addExecutionBlock方法添加block操作,开启多个线程,三个线程
    [op addExecutionBlock:^{
        
        NSLog(@"%@",[NSThread currentThread]);
        
        NSLog(@"第二个操作");
    }];
    
    [op addExecutionBlock:^{
        
        NSLog(@"%@",[NSThread currentThread]);
        
        NSLog(@"第三个操作");
    }];
    
    [op start];

NSOperationQueue-   一个操作序列

//NSOperation是基于GCD的,把GCD的block封装成opertion,NSOperationQueue是全局队列封装
    //将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。
   
    //创建一个操作队列
    NSOperationQueue * queue = [[NSOperationQueue alloc] init];
   
    NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
   
    NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
       
        NSLog(@"op2 - %@",[NSThread currentThread]);
    }];
   
    //添加NSOperation到NSOperationQueue中
    //NSOperation添加到queue之后,通常短时间内就会得到运行。
    //    [queue addOperation:op];
    //    [queue addOperation:op2];
   
    //    waitUntilFinished yes 操作完成后执行下面的代码 no 先执行下面的代码
   
    //添加一个block形式的operation
    [queue addOperationWithBlock:^{
       
        NSLog(@"op3 - %@",[NSThread currentThread]);
       
    }];
   
    [queue addOperations:@[op,op2] waitUntilFinished:NO];

//最大并发数,这个功能NSOperation比较常用
   
    queue.maxConcurrentOperationCount = 2;
   
    for (NSInteger i = 0; i < 10; i++) {
       
        NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
       
        [queue addOperation:op];
    }

NSOperationQueue的依赖关系

self.queue = [[NSOperationQueue alloc] init];
    
    NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
    //设置优先级,数据量少看不出
    op1.queuePriority = -4;

NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"解压图片包");
    }];
    op2.queuePriority = 0;

NSBlockOperation * op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"观看漫画");
    }];
    op3.queuePriority = 4;
    
    //添加NSOperation的依赖对象
//    [op2 addDependency:op1];
//    [op3 addDependency:op2];
    
    //注意:不能创建环形依赖,如A依赖B,B依赖A,这是错误的
    //    [op1 addDependency:op3];
    
    [self.queue addOperations:@[op1,op2,op3] waitUntilFinished:YES];

//挂起状态
    self.queue.suspended = !self.queue.suspended;
// 不过暂停一个queue不会导致正在执行的operation在任务中途暂停,只是简单地阻止调度新Operation执行。

// 取消queue中所有的操作
    [self.queue cancelAllOperations];

//NSOperation 线程之间的通信

[self.queue addOperationWithBlock:^{
       
        NSLog(@"%@",[NSThread currentThread]);
        NSLog(@"下载图片");
       
        //获取主队列
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
           
            NSLog(@"%@",[NSThread currentThread]);
            NSLog(@"更新UI");
           
        }];
    }];

NSOperation与GCD的区别

/**
 *  GCD -- (iOS4.0)多线程解决方案
    将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)
    拿到dispatch_get_main_queue,线程之间的通信

NSOperation -- (iOS2.0)  (后经苹果改造)
 
    将操作添加到队列里
    [NSOperationQueue mainQueue]  获取主队列,将任务添加到主队列,就会在主线程中执行
    NSOperation可以设置最大并发数(用GCD处理,比较麻烦)
    可以暂停可以继续,也就是挂起操作
    取消所有的任务
    设置依赖关系
 */

NSoperation用法详解及与GCD的比较的更多相关文章

  1. C#中string.format用法详解

    C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...

  2. @RequestMapping 用法详解之地址映射

    @RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...

  3. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  4. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  5. CSS中伪类及伪元素用法详解

    CSS中伪类及伪元素用法详解   伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...

  6. c++中vector的用法详解

    c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...

  7. AngularJS select中ngOptions用法详解

    AngularJS select中ngOptions用法详解   一.用法 ngOption针对不同类型的数据源有不同的用法,主要体现在数组和对象上. 数组: label for value in a ...

  8. systemctl命令用法详解

    systemctl命令用法详解系统环境:Fedora 16binpath:/bin/systemctlpackage:systemd-units systemctl enable httpd.serv ...

  9. CSS3的@keyframes用法详解:

    CSS3的@keyframes用法详解:此属性与animation属性是密切相关的,关于animation属性可以参阅CSS3的animation属性用法详解一章节. 一.基本知识:keyframes ...

随机推荐

  1. angularjs中的页面访问权限设置

    11月在赶一个项目,这阵子比较忙,挤挤时间更一篇博客吧,如标题所述说说在ng中页面访问权限控制的问题,水平有限各位看官见谅: 在以往的项目中,前后端常见的配合方式是前端提供页面和ui加一点DuangD ...

  2. 使用Tuple来实现多个Model传送至视图

    前面Insus.NET实现过<使用ViewModel来实现多个Model传送至视图>http://www.cnblogs.com/insus/p/5594134.html 和<使用E ...

  3. MySQL的安装与配置

    首先,到http://www.mysql.com/downloads/下载MySQL的安装文件mysql-installer,双击运行安装. 然后,配置环境变量,右键单击:我的电脑->高级-&g ...

  4. Can't install mysql-python version 1.2.5 in Windows

    Can't install mysql-python version 1.2.5 in Windows http://stackoverflow.com/questions/37092125/cant ...

  5. Maven依赖Scope标签用法

    在一个maven项目中,如果存在编译需要而发布不需要的jar包,可以用scope标签,值设为provided.如下: <dependency>            <groupId ...

  6. 说说Java的内存

    首先,我们来看一段程序内存溢出的代码: import java.util.ArrayList; import java.util.List; public class TestMemoryLeak { ...

  7. ThinkCMF-上传多个图片源码解读

    关键函数: /** * 多图上传 * @param dialog_title 上传对话框标题 * @param container_selector 图片容器 * @param item_tpl_wr ...

  8. Java知识体系

    Java知识体系 java知识结构.jpg web框架.jpg 计算机课程体系.png 2016-08-19_090929.png 流行的哈希算法生存状况.jpg "JAVA之父" ...

  9. this指针

    this Note:不论是类中的构造函数,还是类中的普通成员函数,内部都隐含一个形参叫this指针,用于接收当前正在构造/调用对象的地址,因此不同的对象被构造/调用时,同一个函数的执行结果不同;对于一 ...

  10. PHP mongodb AR

    <?php /** * @author xiaojiang */ abstract class MongoAr{ private $db = null; public function __co ...