一、NSOperation简介

  1.NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程

    NSOperation和NSOperationQueue实现多线程的具体步骤:

    (1)先将需要执行的操作封装到一个NSOperation对象中

    (2)然后将NSOperation对象添加到NSOperationQueue中

    (3)系统会⾃动将NSOperationQueue中的NSOperation取出来

    (4)将取出的NSOperation封装的操作放到⼀条新线程中执⾏

  2.NSOperation的子类

    NSOperation是个抽象类,并不具备封装操作的能力,必须使⽤它的子类

    使用NSOperation⼦类的方式有3种:

      (1)NSInvocationOperation

      (2)NSBlockOperation

      (3)自定义子类继承NSOperation,实现内部相应的⽅法

二、 具体说明

  1.NSInvocationOperation子类

创建对象和执行操作:

1  //创建操作对象,封装要执行的任务
2 //NSInvocationOperation 封装操作
3 NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
4
5 //执行操作
6 [operation start]; 说明:一旦执⾏操作,就会调用target的test方法
8 代码示例:
9 #import "YYViewController.h"
10
11 @interface YYViewController ()
12
13 @end
14
15 @implementation YYViewController
16
17 - (void)viewDidLoad
18 {
19 [super viewDidLoad];
20
21 //NSOperation:抽象类,不具备封装功能
22
23 //创建操作对象,封装要执行的任务
24 //NSInvocationOperation 封装操作
25 NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
26
27 //执行操作
28 [operation start];
29
30 }
31
32 -(void)test
33 {
34
35 NSLog(@"--test--%@--",[NSThread currentThread]);
36 }
37 @end
打印查看:
  

  注意:操作对象默认在主线程中执行,只有添加到队列中才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行。

      只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作

  2.NSBlockOperation子类

创建对象和添加操作:

 1   //创建NSBlockOperation操作对象
2 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
3 //......
4 }];
5
6 //添加操作
7 [operation addExecutionBlock:^{
8 //....
9 }];

代码1:

 9 #import "YYViewController.h"
10
11 @interface YYViewController ()
12
13 @end
14
15 @implementation YYViewController
16
17 - (void)viewDidLoad
18 {
19 [super viewDidLoad];
20
21 //创建NSBlockOperation操作对象
22 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
23 NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
24 }];
25
26
27 //开启执行操作
28 [operation start];
29 }
30 @end

  打印查看:

  

代码2:

9 #import "YYViewController.h"
10
11 @interface YYViewController ()
12
13 @end
14
15 @implementation YYViewController
16
17 - (void)viewDidLoad
18 {
19 [super viewDidLoad];
20
21 //创建NSBlockOperation操作对象
22 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
23 NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
24 }];
25
26 //添加操作
27 [operation addExecutionBlock:^{
28 NSLog(@"NSBlockOperation1------%@",[NSThread currentThread]);
29 }];
30
31 [operation addExecutionBlock:^{
32 NSLog(@"NSBlockOperation2------%@",[NSThread currentThread]);
33 }];
34
35 //开启执行操作
36 [operation start];
37 }
38 @end

    

    注意:只要NSBlockOperation封装的操作数 > 1,就会异步执行操作

3.NSOperationQueue

  NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的

                如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作

                添加操作到NSOperationQueue中,自动执行操作,自动开启线程

 1     //创建NSOperationQueue
2 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
3 //把操作添加到队列中
4 //第一种方式
5 [queue addOperation:operation1];
6 [queue addOperation:operation2];
7 [queue addOperation:operation3];
8 //第二种方式
9 [queue addOperationWithBlock:^{
10 NSLog(@"NSBlockOperation3--4----%@",[NSThread currentThread]);
11 }];         - (void)addOperation:(NSOperation *)op;
        - (void)addOperationWithBlock:(void (^)(void))block; 
代码示例
 9 #import "YYViewController.h"
10
11 @interface YYViewController ()
12
13 @end
14
15 @implementation YYViewController
16
17 - (void)viewDidLoad
18 {
19 [super viewDidLoad];
20
21 //创建NSInvocationOperation对象,封装操作
22 NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
23 NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
24 //创建对象,封装操作
25 NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
26 NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
27 }];
28 [operation3 addExecutionBlock:^{
29 NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
30 }];
31
32 //创建NSOperationQueue
33 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
34 //把操作添加到队列中
35 [queue addOperation:operation1];
36 [queue addOperation:operation2];
37 [queue addOperation:operation3];
38 }
39
40 -(void)test1
41 {
42 NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
43 }
44
45 -(void)test2
46 {
47 NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
48 }
49
50 @end

  打印效果:

      

      注意: 系统自动将NSOperationqueue中的NSOperation对象取出,将其封装的操作放到一条新的线程中执行。上面的代码示例中,一共有四个 任务,

          operation1和operation2分别有一个任务,operation3有两个任务。一共四个任务,开启了四条线程。通过任务执行的时间 全部都是273可以看出,

           这些任务是并行执行的。

      提示:队列的取出是有顺序的,与打印结果并不矛盾。这就好比,选手A,BC虽然起跑的顺序是先A,后B,然后C,但是到达终点的顺序却不一定是A,B在前,C在后。
 

下面使用for循环打印,可以更明显的看出任务是并发执行的。

代码示例:

9 - (void)viewDidLoad
10 {
11 [super viewDidLoad];
12
13 //创建NSInvocationOperation对象,封装操作
14 NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
15 NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
16 //创建对象,封装操作
17 NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
18 for (int i=0; i<5; i++) {
19 NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
20 }
21 }];
22 [operation3 addExecutionBlock:^{
23 for (int i=0; i<5; i++) {
24 NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
25 }
26 }];
27
28 //创建NSOperationQueue
29 NSOperationQueue * queue=[[NSOperationQueue alloc]init];
30 //把操作添加到队列中
31 [queue addOperation:operation1];
32 [queue addOperation:operation2];
33 [queue addOperation:operation3];
34 }
35
36 -(void)test1
37 {
38 for (int i=0; i<5; i++) {
39 NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
40 }
41 }
42
43 -(void)test2
44 {
45 for (int i=0; i<5; i++) {
46 NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
47 }
48 }
49
50 @end

    

四:多线程--NSOperation简单介绍的更多相关文章

  1. iOS开发多线程篇—NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  2. iOS开发多线程篇 09 —NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  3. 【iOS开发】NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  4. 多线程02---pThread简单介绍

    1.简单介绍 pthread 是属于 POSIX 多线程开发框架. 它是c语言提供的一个跨平台的多线程解决方式.因为其在iOS编程中,操作比較麻烦.一般不用,这里介绍只作为了解. 2.pthread的 ...

  5. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  6. TCP同步与异步及阻塞模式,多线程+阻塞模式,非阻塞模式简单介绍

    首先我简单介绍一下同步TCP编程 与异步TCP编程. 在服务端我们通常用一个TcpListener来监听一个IP和端口.客户端来一个请求的连接,在服务端可以用同步的方式来接收,也可以用异步的方式去接收 ...

  7. [QT]简单介绍一下 *.pro、*.pri、*.prf、*.prl等四种文件

    转自:http://blog.csdn.net/dbzhang800/article/details/6348432 简单介绍一下 *.pro.*.pri.*.prf.*.prl等四种文件:干嘛用的, ...

  8. C# 基础知识 (四).C#简单介绍及托管代码

            暑假转瞬即逝,从10天的支教生活到1周的江浙沪旅游,在这个漫长的暑假中我经历了非常多东西,也学到了非常多东西,也认识到了非常多不足之处!闲暇之余我准备又一次进一步巩固C#相关知识,包含 ...

  9. java多线程(简单介绍)

    简单介绍 线程是程序运行的基本执行单元.当操作系统(不包括单线程的操作系统,如微软早期的DOS)在执行一个程序时,会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被称为主线程)来 ...

随机推荐

  1. 在JavaScript中获取Map集合中的key和value值(前提是:既不知道key为什么值,也不知道value有哪些值)

  2. UVALive 4015 树形dp

    题目大意: 从一个根节点出发,走最多 x 的长度,问最多能走过多少个节点,图保证是一棵树 dp[0][i][j] , 表示走从i点为根的子树走过了j个点最后回到 i 最少需要多少时间dp[1][i][ ...

  3. 线段上的格点 辗转相除法(GCD)

    /*问题描述:线段上的格点给定平面上的两个格点 P1 = (x1, y1) ; P2 = (x2, y2) 线段P1 P2上,除P1 和 P2以外一共有几个格点*//*分析过程在格点上画P1(0,5) ...

  4. [NOIP2000] 提高组 洛谷P1023 税收与补贴问题

    题目背景 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递 ...

  5. svg学习之旅(3)

    常用标签: <g>标签 是一个容器(分组)标签,用来组合元素的 - 共用属性 - transform = "translate(0,0)"<text>标签 ...

  6. ACM-ICPC 2018 南京赛区网络预赛 L && BZOJ 2763 分层最短路

    https://nanti.jisuanke.com/t/31001 题意 可以把k条边的权值变为0,求s到t的最短路 解析  分层最短路  我们建立k+1层图 层与层之间边权为0,i 向 i+1层转 ...

  7. CEF3研究(一)

    一.基本概览 C++ WrapperC++Wrapper(包装类)就是将C结构包装C++类. 这是C/C++API转换层通过translator tool自动产生的. 进程     CEF3用多进程运 ...

  8. 使用HDP快速搭建Hadoop开发环境 | Debugo

    本文简单记录了一下使用VMware workstation 10.CentOS和HDP 2.0.6(Hadoop 2.2)发行版构建Hadoop开发测试环境的全部流程.这个过程中我遇到了不少问题,也耽 ...

  9. HDU 1201 18岁生日 【日期】

    18岁生日 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  10. 白话空间统计之四:P值和Z值(上):零如果

    本来今天想要讲讲软件操作的,后来发现好像还有好几个重要的指标没有说,干脆等所有说完在讲操作吧.否则操作出来的结果会发现大量的"不明觉厉". 首先是空间统计里面非常神奇的两个值:P值 ...