NSOperation简介

相对于 GCD ,具有面向对象的特征,比 GCD 更简单易用,代码可读性强

NSOperatioin 单独使用时, 不具有开辟新线程的能力, 只是同步执行操作, 需要配合 NSOpeationQueue 来实现多线程操作

//验证: 没有队列时, 同步执行

//子类 NSBlockOperation

//NSBlockOperation还提供了一个方法addExecutionBlock:

//额外添加 block 任务

- (void)blockOperation{

NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"------%@", [NSThread currentThread]);

}];

// 添加额外的任务(在子线程执行)

[op addExecutionBlock:^{

NSLog(@"2------%@", [NSThread currentThread]);

}];

[op addExecutionBlock:^{

NSLog(@"3------%@", [NSThread currentThread]);

}];

[op addExecutionBlock:^{

NSLog(@"4------%@", [NSThread currentThread]);

}];

//直接执行,没有放到 queue 中,不会开启新线程,在主线程中执行

[op start];

}

一.使用步骤:

1.创建队列

2.创建任务

3.将任务添加到队列中(异步执行, 开启新线程)

//任务 添加 到队列中

//在队列中 会 开启新线程

- (void)addTaskToQueue{

//1.创建队列

NSOperationQueue *queue = [[NSOperationQueue alloc]init];

// 2. 创建操作

// 创建NSInvocationOperation

NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];

// 创建NSBlockOperation

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

for (int i = 0; i < 2; ++i) {

NSLog(@"2-----%@", [NSThread currentThread]);

}

}];

//--添加依赖

//2 依赖1 ,则必须 1 完成之后,才会执行2

[op2 addDependency:op1];

//--设置最大并发数

//    queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列

queue.maxConcurrentOperationCount = 2;

//3.将任务添加到队列中

[queue addOperation:op1];

[queue addOperation:op2];

//4.不需要创建任务,queueu直接添加 block 任务

[queue addOperationWithBlock:^{

for (int i = 0; i < 2; ++i) {

NSLog(@"3-----%@", [NSThread currentThread]);

}

}];

}

二.特性方法

1.任务之间可以添加依赖

//--添加依赖

//2 依赖1 ,则必须 1 完成之后,才会执行2

[op2 addDependency:op1];

2.队列可以设置最大并发数

//--设置最大并发数

//    queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列

queue.maxConcurrentOperationCount = 2;

三.其他方法

  • - (void)cancel; NSOperation提供的方法,可取消单个操作
  • - (void)cancelAllOperations; NSOperationQueue提供的方法,可以取消队列的所有操作
  • - (void)setSuspended:(BOOL)b; 可设置任务的暂停和恢复,YES代表暂停队列,NO代表恢复队列
  • - (BOOL)isSuspended; 判断暂停状态

注意: 暂停 和 取消 并不代表可以将当前的操作 立即取消或暂停, 而是将当前的操作执行完成之后, 不再执行其他的新操作了

暂停与取消的 区别: 是否可以继续向下执行

多线程 NSOpeartion 的使用的更多相关文章

  1. iOS - Threads 多线程

    1.Threads 1.1 进程 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开 QQ.Xcode,系统就会分别启动两个进程. ...

  2. iOS:操作队列实现多线程NSOperation

    NSOperation具体使用:直接继承NSObject 它的子类有:NSBlockOperation.NSInvocationOperation 还有一个必须的类,队列,用来装创建的线程 NSOpe ...

  3. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  4. 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例

    前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...

  5. 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)

    前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...

  6. Java多线程

    一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是一个线程.   进程:进程 ...

  7. .NET基础拾遗(5)多线程开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  8. Java多线程基础——对象及变量并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

  9. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

随机推荐

  1. Python绘图matplotlib

    转自http://blog.csdn.net/ywjun0919/article/details/8692018 Python图表绘制:matplotlib绘图库入门 matplotlib 是pyth ...

  2. Git的配置和使用帮助

    Git的配置和使用帮助 1.Git的配置 ============== Git有三个地方可以存放配置:系统级配置文件/etc/gitconfig.用户级配置文件~/.gitconfig和仓库级配置文件 ...

  3. 在64位SQL Server中创建Oracle的链接服务器 Link Server

    有时候我们希望在一个sqlserver下访问另一个sqlserver数据库上的数据,或者访问其他oracle数据库上的数据,要想完成这些操作,我们首要的是创建数据库链接. 数据库链接能够让本地的一个s ...

  4. day18-事务与连接池 1.复习

    实际开发中事务必须得用.

  5. Ionic01 简单介绍、环境搭建、创建项目、项目结构、创建组件、创建页面、子页面跳转

    1 Ionic 基本介绍 Ionic 是一款基于 Angular.Cordova 的强大的 HTML5 移动应用开发框架 , 可以快速创建一个跨平台的移动应用.可以快速开发移动 App.移动端 WEB ...

  6. lucene和solr

    我们为什么要用solr呢? 1.solr已经将整个索引操作功能封装好了的搜索引擎系统(企业级搜索引擎产品) 2.solr可以部署到单独的服务器上(WEB服务),它可以提供服务,我们的业务系统就只要发送 ...

  7. c语言解二元二次方程组

    设a和b是正整数 a+b=30 且a*b=221 求a和b的值 思路就是穷举a和b的值,每次得到a和b的一个值,看是否同时满足a+b=30且a*b=221,如果满足,那么就输出. 那么a和b的的取值范 ...

  8. mysql for visual

    http://dev.mysql.com/downloads/file.php?id=458484

  9. JMS-消息中间件的应用02-安装ActiveMQ-来自慕课学习-新手学习

    What is ActiveMQ?       -----突然好想打英文,好奇怪 请看来自官网的介绍: Apache ActiveMQ ™ is the most popular and powerf ...

  10. c# 半角转换为全角 判断是否是全角

    #region 半角转换为全角 /// <summary> /// 半角转换为全角 ////转全角的函数(SBC case) ///任意字符串 ///全角空格为12288,半角空格为32 ...