一、NSOperation基本概念
NSOperation是我们在开发中常用的多线程处理的手段之一,其实NSOperation是对GCD的包装,它的两个核心概念是【队列+操作】。
二、NSOperation常用方法
NSOperation本身就是一个抽象类,只能使用它的子类,常用的三个子类分别是:NSBlockOperation、NSInvocationOperation以及自定义继承自NSOperation的类。通过利用NSOperation和NSOperationQueue结合使用实现多线程并发。三种用法举例说明:
- (void)viewDidLoad { [super viewDidLoad]; -----------------------------NSInvocationOperation-------------------------------- //实例化一个线程操作对象 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomthing:) object:nil]; //设置如果线程执行完毕以后,回调的block函数 [op1 setCompletionBlock:^{ NSLog(@"op1执行完毕"); }]; //设置优先级 op1.queuePriority = NSOperationQueuePriorityVeryLow; -----------------------------NSBlockOperation-------------------------------- //带block的NSOperation NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{ //线程需要执行的代码 NSLog(@"op2正在执行"); }]; [op2 setCompletionBlock:^{ NSLog(@"op2执行完毕"); }]; -----------------------------继承NSOperation的自定义类------------------------------ //MyOperation 是继承NSOperation的自定义类,里面实现了这样一个函数-(void)main{NSLog(@"MyOperation执行中...");} MyOperation *op3 = [MyOperation new]; [op3 setCompletionBlock:^{ NSLog(@"op3执行完毕"); }]; //设置优先级 op3.queuePriority = NSOperationQueuePriorityVeryHigh; //添加到线程池(队列) NSOperationQueue *queue = [NSOperationQueue new]; //只允许开启一个线程 //此时会变成串行任务 queue.maxConcurrentOperationCount = 1; //添加到线程池之后,就会自动开启线程,默认是并发执行任务 [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3]; } -(void)doSomthing:(id)sender{ NSLog(@"op1正在执行"); }
三、队列的取消,暂停和恢复
(1)取消队列的所有操作
- (void)cancelAllOperations;
提⽰:也可以调用NSOperation的- (void)cancel⽅法取消单个操作
(2)暂停和恢复队列
- (void)setSuspended:(BOOL)b; // YES代表暂停队列,NO代表恢复队列
- (BOOL)isSuspended; //当前状态
(3)暂停和恢复的适用场合:在tableview界面,开线程下载远程的网络界面,对UI会有影响,使用户体验变差。那么这种情况,就可以设置在用户操作UI(如滚动屏幕)的时候,暂停队列(不是取消队列),停止滚动的时候,恢复队列。