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}
|
|