多线程NSOperation使用方法

/*------------------------------  NSOperation使用   -----------------------------------*/

重点:操作 NSOperation 和操作队列 NSOperationQueue!

{

1.NSOperation(操作)简介:

NSOperation: // 本质是对 GCD 的封装, OC 语言.

NSOperation 和 GCD 的比较:

GCD使用场合:

一些简单的需求,简单的多线程操作. //简单高效

NSOperation使用场合:

各个操作之间有依赖关系,操作需要取消/暂停;需要限制同时执行的线程数量,让线程在某时刻停止/继续等.

配合使用 NSOperation和 NSOperationQueue 也可以实现多线程.

2.NSOperation使用:

NSOperation: 抽象类,不能直接使用,需要使用其子类.

抽象类:定义子类共有的属性和方法.// CAAnimation/CAPropertyAnimation...

两个常用子类: NSInvocationOperation(调用) 和 NSBlockOperation(块);

两者没有本质区别,后者使用 Block 的形式组织代码,使用相对方便.

自定义子类继承自 NSOperation,实现内部相应的方法. // 高级用法

}

/*----------------------------  NSOperation使用 2.NSOperation ------------------------------*/

重点:1.NSBlockOperation, NSInvocationOperation的使用.

{

1. 创建 NSInvocationOperation 对象

// 创建 NSInvocationOperation

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

//默认情况下,调用 start 方法之后,不会开启新线程,只会在当前线程执行操作.

[op1 start];

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

2. 创建 NSBlockOperation 对象

// 创建 NSBlockOperation

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"下载图片1---%@",[NSThread currentThread]);

}];

// 添加更多操作

[op2 addExecutionBlock:^{

NSLog(@"下载图片2---%@",[NSThread currentThread]);

}];

[op2 addExecutionBlock:^{

NSLog(@"下载图片3---%@",[NSThread currentThread]);

}];

// 只要 NSBlockOperation 中封装的操作数 > 1, 调用start方法之后就会开启多条线程并发执行

// 如果 NSBlockOperation 中封装的操作数 == 1,调用 start 方法之后,不会开启新线程,只会在当前线程执行操作

[op2 start];

注意: 只要 NSBlockOperation 中封装的操作数 > 1,就会异步执行这些操作.(将操作添加到 NSOperationQueue中或者直接调用 start方法都会开启多条线程异步执行).

}

/*---------------------------- NSOperation使用 3.NSOperationQueue --------------------------*/

重点:将操作添加到队列中;

{

NSOperation 可以调用 start 方法来执行任务,但默认是同步执行的.

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

1.NSOperationQueue(操作队列):

<1> 主队列

[NSOperationQueue mainQueue] //获取主队列

添加到"主队列"中的操作,都会放在主线程执行!

<2>非主队列

[[NSOperationQueue alloc] init]; //创建非主队列

添加到"非主队列"中得操作,都会放在子线程中执行.

2.使用: 添加操作到操作队列中.

// 创建 NSInvocationOperation 操作

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

// 创建 NSBlockOperation 操作

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"下载图片1---%@",[NSThread currentThread]);

}];

// 1.创建一个 NSOperationQueue

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

// 2.将操作添加到队列中.

[queue addOperation:op1];

[queue addOperation:op2];

注意:另外一种添加操作到队列中的方法: block

[queue addOperationWithBlock:^{

NSLog(@"下载图片5---%@",[NSThread currentThread]);

}];

队列中任务的执行是无序的.

}

/*-------------------------------- NSOperation使用 4.常见用法1 -------------------------------*/

重点:1.设置操作依赖. 2.设置最大并发数.

{

问题:是否可以让队列中的操作有序执行?

回答上问题: 能,设置操作依赖.

1.NSOperation设置操作依赖: // 执行顺序: op1,op2,op3;

// 操作op3依赖于操作op2;

[op3 addDependency:op2];

// 操作op2依赖于操作op1;

[op2 addDependency:op1];

注意:不能相互依赖.

2.NSOperationQueue设置最大并发数.

并发数:同时开启的线程数.

// 创建操作队列

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

// 设置操作队列的最大并发数

queue.maxConcurrentOperationCount = 3;

[queue setMaxConcurrentOperationCount:3];

}

/*-------------------------------- NSOperation使用 5.常见用法2 -------------------------------*/

重点:1.队列的取消/暂停/恢复  2.线程间通信. 注意问题:为什么要取消/恢复队列? 在什么时候用?

{

1.NSOperationQueue 的取消/暂停/恢复

// 取消操作 op1. 取消单个操作.

[op1 cancel];

// 取消所有操作,不会再次恢复

[queue cancelAllOperations];

// 暂停所有操作;注意,已经开始的操作不会暂停.

[queue setSuspended:YES];

// 重新开始所有操作

[queue setSuspended:NO];

为什么要取消恢复队列? 在什么时候用?

1.为了内存管理,处理内存警告; 2.为了用户体验,保证滚动流畅.

// 接收到内存警告的时候果断取消队列中的所有操作

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

[queue cancelAllOperations]; // 取消队列中的所有任务(不可恢复)

}

// 开始滚动的时候暂停队列中的任务.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

[queue setSuspended:YES]; // 暂停队列中的所有任务

}

// 滚动结束的时候恢复队列中的任务.

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

{

[queue setSuspended:NO]; // 恢复队列中的所有任务

}

2.线程间通信  // 子线程下载图片,主线程设置图片.

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

[queue addOperationWithBlock:^{

// 1.异步下载图片

NSURL *url = [NSURL URLWithString:@"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg"];

NSData *data = [NSData dataWithContentsOfURL:url];

UIImage *image = [UIImage imageWithData:data];

// 2.回到主线程,显示图片

[[NSOperationQueue mainQueue] addOperationWithBlock:^{

self.imageView.image = image;

}];

}];

}

时间: 2024-10-06 02:27:08

多线程NSOperation使用方法的相关文章

【iOS】多线程NSOperation

NSOperation是苹果封装的一套多线程的东西,不像GCD是纯C语言的,这个是OC的.但相比较之下GCD会更快一些,但本质上NSOPeration是多GDC的封装. 一.NSOperation与GCD的比较 GCD是基于c的底层api,NSOperation属于object-c类.ios首先引入的是NSOperation,IOS4之后引入了GCD和NSOperationQueue并且其内部是用gcd实现的. GCD优点:GCD主要与block结合使用.代码简洁高效.执行效率稍微高点. NSO

Win32 多线程的创建方法,区别和联系

Win32多线程的创建方法主要有: CreateThread() _beginthread()&&_beginthreadex() AfxBeginThread() CWinThread类 一.简介 CreateThread: Win32提供的创建线程的最基础的API,用于在主线程上创建一个线程.返回一个HANDLE句柄(内核对象).在内核对象使用完毕后,一般需要关闭,使用CloseHandle()函数. _beginthread()&&_beginthreadex():_

一种非常简便的实现Android多线程池的方法

开发Android过程中至少会遇到一个主线程,也称UI线程,这个线程是不允许阻塞的,否则会报错,比如最常见的获取网络资源.读写文件等操作,这些耗时操作都不能再主线程使用.这里介绍一个非常高效又非常简单实用的方法ExecutorService类. ExecutorService类可以理解为线程池,开发者可以实例化一个该对象,在其中使用多个异步进行的操作. ExecutorService接口继承了Executor接口,定义了一些生命周期的方法,如下定义. public interface Execu

多线程的创建方法

- (void)viewDidLoad {    [super viewDidLoad]; //第一种开启新的线程调用 mutableTheard    NSThread * t = [[NSThread alloc]initWithTarget:self selector:@selector(mutableTheard) object:nil];    [t start];            //第二种开启新的线程调用 mutableTheard    [NSThread detachNe

Java多线程死锁避免方法

一.什么是死锁当两个或两个以上的线程在执行过程中,因为争夺资源而造成的一种相互等待的状态,由于存在一种环路的锁依赖关系而永远地等待下去,如果没有外部干涉,他们将永远等待下去,此时的这个状态称之为死锁.经典的 "哲学家进餐" 问题很好地描述了死锁状况:5个哲学家去吃中餐,坐在一张圆桌旁,他们有5根筷子(而不是5双),并且每两个人中间放一根筷子,哲学家们要么在思考,要么在进餐,每个人都需要一双筷子才能吃到东西,并在吃完后将筷子放回原处继续思考,有些筷子管理算法 (1) 能够使每个人都能相对

多线程----NSOperation

NSOperation是Cocoa中的一个抽象类,用来封装单个任务和代码执行一项操作,由于是抽象类,所以不能直接实例化使用,必须定义子类继承该抽象类来实现, 使用NSOperation的方式有两种: 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation,有相关的使用方法. NSOperation的子类NSInvocationOperation提供了一套简单的多线程编程方法,是IOS多线程编程中最简单的一种实现方式. 另一种是继承NSOper

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

NSOperation具体使用:直接继承NSObject 它的子类有:NSBlockOperation.NSInvocationOperation 还有一个必须的类,队列,用来装创建的线程 NSOperationQueue 理解:这个方式是如何实现多线程呢?是通过操作队列来实现多线程的.即主线程是一个主队列,再创建一个队列并将其他的线程加入其中同步执行.如果对共享资源的争夺放在主线程队列中,则不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上:否则的话,仍需要关心数据同步的问

四:多线程--NSOperation简单介绍

一.NSOperation简介 1.NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的NSOperation取出来 (4)将取出的NSOperation封装的

iOS开发——多线程OC篇&amp;(九)多线程NSOperation介绍

NSOperation介绍 一.NSOperation简介 1.简单说明 NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的NSOperation取出来 (4