iOS-NSOperation多线程编程详解

iOS-多线程编程之NSOperation使用详解


前面一篇文章中说到NSThread的多线程的实现,在说NSOperation多线程编程之前,先来对它们进行比较:

一.NSThread 与 NSOperation的比较

1.NSThread新建一个实例变量就是一个线程,相当于手动的创建了一个线程并拥有线程的入口函数,NSOperation新建一个实例只是创建了一个运行任务,并没有创建一个线程,只有把它放到一个NSOperationQueque线程队列中,当运行到它的时候就会有一个线程运行NSOperation的任务;前者的任务执行线程是开发者创建,而后者的任务执行线程为负责运行NSOperationQueque队列中的线程池运行,NSOperationQueue只是一个容器,具体的执行线程由app官方实现,这样就省掉了多线程编程中的线程管理,交给系统或者框架管理,对比说明如下图


二.NSOperation头文件代码分析

NSOperation是一个抽象的类,开发者可以通过子类化来实现多线程的编程;

- (void)start;        //手动启动并执行该任务操作,其本质是把改Operation添加到系统定义的NS OperationQueue中,该操作队列是[NSOperationQueue mainqueue],优先级别高,可优先执行

- (void)main;//该操作的入口函数相当于线程的入口函数,应用程序的main函数,你想多线程执行的任务一般都放到该函数中

@property (readonly,getter=isCancelled) BOOL cancelled;  //状态的判断

- (void)cancel;//撤销该操作

@property (readonly,getter=isExecuting) BOOL executing;    //执行状态判断

@property (readonly,getter=isFinished) BOOL finished;//判断是否执行完成

@property (readonly,getter=isAsynchronous) BOOL asynchronous    //表示是不是异步操作

@property (readonly,getter=isReady) BOOL ready;     //执行准备状态判断

- (void)addDependency:(NSOperation *)op;    //添加依赖的NSOperation,也就是改操作的执行要依赖op,只有op执行完成了才执行自己的操作

- (void)removeDependency:(NSOperation *)op;   //清除依赖操作

@property (readonly,copy) NSArray *dependencies;//可读属性通过该属性可以得到该操作的依赖操作数组

@property NSOperationQueuePriority queuePriority;        //操作队列的优先级,优先级别越高,任务获得的执行时间片久越多

@property (copy)void (^completionBlock)(void)  //当该操作执行完成之后要执行的操作可以写到该block中

三.系统提供了两个NSOperation的子类,NSBlockOperation 和NSInvocationOperation

1.NSBlockOperation

NSBlockOperation *blk = [NSBlockOperationblockOperationWithBlock:^{

         NSLog(@"你好,我是NSBlockOperation");

     }]; //新建一个BlockOperation,此时该操作并未执行,


[blk start] //通过手动的启动,该block就被执行了,启动方法一


[[NSOperationQueuemainQueue] addOperation:blk]; //通过把blk添加到操作队列中,当队列运行到blk, 它就会调用该blk的启动操作 启动方法二

//两种启动方法都可以启动

blk.completionBlock =^{

        NSLog(@"你好,我时completionBlock");

    }; //给completionBlock是该操作执行完成之后就会执行的任务



小结:Block是线程的执行指令,启动两种方法可以任选其一


运行结果:

2014-12-29 23:33:16.701 gcd[766:36714]你好,我是NSBlockOperation

2014-12-29 23:33:16.702 gcd[766:36745]你好,我时completionBlock


2.NSInvocationOperation

NSInvocationOperation *invctOpt = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(operationSelect:)object:nil];

    [invctOptstart]; //operationSelect:是operation的执行入口,其功能和NSBlockOperation的block,用户可以指定执行self或者其他实例对象中的operation Select:方法作为NSInvocationOperation的执行任务入口


3.NSOperation 的子类化

#import "MyOperation.h"

@implementation MyOperation
-(void)main{
    NSLog(@"你好,我是子类化的operation");
}
@end


子类化的operation使用

MyOperation *my = [[MyOperation alloc]init];
    [my start];

4.小结

不管你用什么方法使用operation你手动的start它会默认的添加到NSOperationQueue Main Queue中并执行,自然它是在主线程上执行,如果想不再主线程上执行就自己新建一个queue,并把operation丢到里面去,NSOperation和NSThread的用法非常相似,可以说NS Operation把多线程的任务重NSThread分离出来,这样在使用NSOperation实现多线程任务时就可以不用维护线程的任务,而是把线程的任务交给系统或者框架,在编程时可以通过

[NSOperationQueue currentQueue]来得到操作的队列,从而可以控制最大的并发量,

 通过suspended来设置挂起状态,

- (void)cancelAllOperations这个函数是用来取消所有的操作,





posted @ 2014-12-29 22:37  fineman  阅读(220)  评论(0编辑  收藏  举报