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

一、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方法

代码示例:

 1 //
2 // YYViewController.m
3 // 01-NSOperation基本1
4 //
5 // Created by 孔医己 on 14-6-25.
6 // Copyright (c) 2014年 itcast. All rights reserved.
7 //
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 }];
10

代码示例:

代码1:

 1 //
2 // YYViewController.m
3 // 02-NSTherad基本2
4 //
5 // Created by 孔医己 on 14-6-25.
6 // Copyright (c) 2014年 itcast. All rights reserved.
7 //
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 //创建NSBlockOperation操作对象
22 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
23 NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
24 }];
25
26
27 //开启执行操作
28 [operation start];
29 }
30 @end

打印查看:

代码2:

 1 //
2 // YYViewController.m
3 // 02-NSTherad基本2
4 //
5 // Created by 孔医己 on 14-6-25.
6 // Copyright (c) 2014年 itcast. All rights reserved.
7 //
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 //创建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;

代码示例:

 1 //
2 // YYViewController.m
3 // 03-NSOperation基本3
4 //
5 // Created by 孔医己 on 14-6-25.
6 // Copyright (c) 2014年 itcast. All rights reserved.
7 //
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 //创建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循环打印,可以更明显的看出任务是并发执行的。

代码示例:

 1 #import "YYViewController.h"
2
3 @interface YYViewController ()
4
5 @end
6
7 @implementation YYViewController
8
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

 
 

iOS开发多线程篇 09 —NSOperation简单介绍的更多相关文章

  1. iOS开发多线程篇—自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

  2. iOS开发多线程篇 10 —NSOperation基本操作

    iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...

  3. iOS开发多线程篇 11 —自定义NSOperation

    iOS开发多线程篇—自定义NSOperation 一.实现一个简单的tableView显示效果 实现效果展示: 代码示例(使用以前在主控制器中进行业务处理的方式) 1.新建一个项目,让控制器继承自UI ...

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

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

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

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

  6. iOS开发多线程篇—GCD介绍

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  7. iOS开发多线程篇 05 —GCD介绍

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

  8. iOS开发多线程篇—NSOperation基本操作

    iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...

  9. iOS开发多线程篇—GCD简介

    iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...

随机推荐

  1. 找出能被5或6整除,但是不能被两者同时整除的数 Exercise05_11

    /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:找出能被5或6整除,但是不能被两者同时整除的数 * */ public class Exercise05_11 { publi ...

  2. iOS开发中几种常见的存储方式

    1.archive 归档 数据的保存 1: let result = NSKeyedArchiver.archiveRootObject(contacts, toFile: path as Strin ...

  3. 网络抓包工具Wireshark和Fidder

    http://fangxin.blog.51cto.com/1125131/735178 http://blog.csdn.net/jiangwei0910410003/article/details ...

  4. C#的Xamarin开发小米盒子应用并以WCF实现微信通知

    对于熟悉C#语言的开发人员而言,用Xamarin开发Android应用也是一个不错的选择.小米盒子是Android系统.当然也就能够使用Xamarin来开发.首选来看效果图. watermark/2/ ...

  5. centos7 iptables和firewalld学习记录

    centos7系统使用firewalld服务替代了iptables服务,但是依然可以使用iptables来管理内核的netfilter 但其实iptables服务和firewalld服务都不是真正的防 ...

  6. 安装Scala 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner 错误

    对于安装Scala时 找不到或无法加载主类 scala.tools.nsc.MainGenericRunner 错误,不管是linux还是window系统,原因很大可能是scala的安装路径中出现空格 ...

  7. 开源的C# websocket-sharp组件解析

    下面我们介绍一款WebSocket组件websocket-sharp的相关内容. 一.websocket-sharp组件概述 websocket-sharp是一个C#实现websocket协议客户端和 ...

  8. Codeforces 553B Kyoya and Permutation

    problem 题意 本题题意不太easy看懂. 给定一个序列,我们能够把这个序列变成一些循环置换的和.然而这样的置换的方法是不止一种的.我们定义一种standard cyclic represent ...

  9. Node.js meitulu图片批量下载爬虫1.02版

    以前版本需要先查看网页源码,然后肉眼找到图片数量和子目录,虽说不费事,但多少有点不方便. 于是修改了一下,用cheerio自己去找找到图片数量和子目录,只要修改页面地址就行了.至此社会又前进了一步. ...

  10. 倍福TwinCAT(贝福Beckhoff)应用教程12.1 TwinCAT控制松下伺服 连接和试运行

    首先是用松下伺服自带的软件可以测试运行(驱动器,电机都连接好,然后用USB线连接到松下伺服驱动器的X1口),打开调试软件会自动提示连接到伺服   一般需要对驱动器清除绝对值编码器数据(驱动器可能报错4 ...