配色: 字号:
Objective-C的NSOperation多线程类基本使用指南
2016-10-29 | 阅:  转:  |  分享 
  
Objective-C的NSOperation多线程类基本使用指南

这篇文章主要介绍了Objective-C的NSOperation多线程类基本使用指南,谈到了Operations的执行顺序和并发量等设置操作,需要的朋友可以参考下

NSOperation

一、NSOperation1.简介NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:1>Foundation框架提供了两个具体子类直接供我们使用:NSInvocationOperation和NSBlockOperation2>自定义子类继承NSOperation,实现内部相应的方法

2.执行操作NSOperation调用start方法即可开始执行操作,NSOperation对象默认按同步方式执行,也就是在调用start方法的那个线程中直接执行。NSOperation对象的isConcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isConcurrent方法默认返回NO,表示操作与调用线程同步执行

3.取消操作operation开始执行之后,默认会一直执行操作直到完成,我们也可以调用cancel方法中途取消操作

复制代码代码如下:

[operationcancel];

4.监听操作的执行如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情

复制代码代码如下:

operation.completionBlock=^(){NSLog(@"执行完毕");};

或者

复制代码代码如下:

[operationsetCompletionBlock:^(){NSLog(@"执行完毕");}];

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

2.创建并执行操作

复制代码代码如下:

//这个操作是:调用self的run方法NSInvocationOperationoperation=[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(run)object:nil];//开始执行任务(同步执行)[operationstart];

三、NSBlockOperation1.简介能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成

2.创建并执行操作

复制代码代码如下:

NSBlockOperationoperation=[NSBlockOperationblockOperationWithBlock:^(){NSLog(@"执行了一个新的操作,线程:%@",[NSThreadcurrentThread]);}];//开始执行任务(这里还是同步执行)[operationstart];

3.通过addExecutionBlock方法添加block操作

复制代码代码如下:

NSBlockOperationoperation=[NSBlockOperationblockOperationWithBlock:^(){NSLog(@"执行第1次操作,线程:%@",[NSThreadcurrentThread]);}];[operationaddExecutionBlock:^(){NSLog(@"又执行了1个新的操作,线程:%@",[NSThreadcurrentThread]);}];[operationaddExecutionBlock:^(){NSLog(@"又执行了1个新的操作,线程:%@",[NSThreadcurrentThread]);}];[operationaddExecutionBlock:^(){NSLog(@"又执行了1个新的操作,线程:%@",[NSThreadcurrentThread]);}];//开始执行任务[operationstart];

打印信息如下:

1

2

3

4 2013-02-0221:38:46.102thread[4602:c07]又执行了1个新的操作,线程:{name=(null),num=1}

2013-02-0221:38:46.102thread[4602:3f03]又执行了1个新的操作,线程:{name=(null),num=5}

2013-02-0221:38:46.102thread[4602:1b03]执行第1次操作,线程:{name=(null),num=3}

2013-02-0221:38:46.102thread[4602:1303]又执行了1个新的操作,线程:{name=(null),num=4}

唯一的限制是不能创建环形依赖,比如A依赖B,B依赖A,这是错误的

2.依赖关系会影响到NSOperation对象在queue中的执行顺序,看下面的例子:1>没有设置依赖关系

复制代码代码如下:

NSOperationQueuequeue=[[NSOperationQueuealloc]init];NSBlockOperationoperation1=[NSBlockOperationblockOperationWithBlock:^(){NSLog(@"执行第1次操作,线程:%@",[NSThreadcurrentThread]);}];NSBlockOperationoperation2=[NSBlockOperationblockOperationWithBlock:^(){NSLog(@"执行第2次操作,线程:%@",[NSThreadcurrentThread]);}];[queueaddOperation:operation1];[queueaddOperation:operation2];

打印信息:

1

2 2013-02-0300:21:35.024thread[5616:3d13]执行第1次操作,线程:{name=(null),num=3}

2013-02-0300:21:35.063thread[5616:1303]执行第2次操作,线程:{name=(null),num=4} 1

2 2013-02-0300:24:16.260thread[5656:1b03]执行第2次操作,线程:{name=(null),num=3}

2013-02-0300:24:16.285thread[5656:1303]执行第1次操作,线程:{name=(null),num=4}





















献花(0)
+1
(本文系白狐一梦首藏)