NSOperation

使用NSOperation能达到和GCD同样的功能且不复杂,但是却比GCD控制力更强。

一般是NSOperation和NSOperationQueue配合使用。

首先比较三种多线程技术的优缺点:

1)NSThread
优点:NSThread 比其他两个轻量级
缺点:需要自己管理线程的生命周期,线程同步。线程同步对数据的加锁会有一定的系统开销

2)Cocoa  NSOperation
优点:不需要关心线程管理, 数据同步的事情,可以把精力放在自己需要执行的操作上。
Cocoa operation相关的类是NSOperation, NSOperationQueue.
NSOperation是个抽象类,使用它必须用它的子类,可以实现它或者使用它定义好的两个子类: NSInvocationOperation和NSBlockOperation.
创建NSOperation子类的对象,把对象添加到NSOperationQueue队列里执行。

3) GCD(全优点)

Grand Central dispatch(GCD)是Apple开发的一个多核编程的解决方案。在iOS4.0开始之后才能使用。GCD是一个替代NSThread, NSOperationQueue,NSInvocationOperation等技术的很高效强大的技术。

1、NSOperationQueue(队列)

创建:NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
设置:[queue setMaxConcurrentOperationCount:5];线程队列中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作。

   queue.name = @"test";设置名称

获取:- (NSInteger)maxConcurrentOperationCount;或者线程队列中的线程数

提示:最大并发数不要乱写(5以内),不要开太多,一般以2~3为宜,因为虽然任务是在子线程进行处理的,但是cpu处理这些过多的子线程可能会影响UI,让UI变卡。

取消队列的所有操作:(void)cancelAllOperations;

          也可以使用NSOperation的- (void)cancel 取消单个的线程。

暂停和恢复队列:-(void)setSuspended:(BOOL)b; // YES代表暂停队列中还没有开始的操作,NO代表恢复队列;

        -(BOOL)isSuspended; //当前状态

对tableview的优化:可以设置在用户操作UI(如滚动屏幕)的时候,暂停队列(不是取消队列),停止滚动的时候,恢复队列。这样UI不会有卡顿。

2、NSOperation

系统提供两个子类NSInvocationOperation和NSBlockOperation.或者手动继承NSOperation(有固定流程)

创建:NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];

     NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^

                     for (int i=0; i<5; i++)

                      {

                         NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);

                      

                                             }];

设置操作依赖: [operationB addDependency:operationA]; // 操作B依赖于操作

        [operation3 addDependency:operation1];先执行operation1后执行operation3

              可以在不同queue的NSOperation之间创建依赖关系

      

 

 

添加到队列:    [queue addOperation:operation1];

        [queue addOperation:operation3];添加之后会自动执行。

       - (void)addOperationWithBlock:(void (^)(void))block;

操作监听:可以监听一个操作的执行完毕

- (void (^)(void))completionBlock;
- (void)setCompletionBlock:(void (^)(void))block;

operation3.completionBlock = ^{

                  NSLog(@"操作完成!");

                };

此block执行亦在当前线程。

 

优先级设定:NSOperationQueuePriorityLow, NSOperationQueuePriorityNormal, NSOperationQueuePriorityHigh和NSOperationQueuePriorityVeryHigh.

      说明:优先级高的任务,调用的几率会更大。但是可能会出现优先级反转的情况。

取消:- (void)cancel;

 





 
原文地址:https://www.cnblogs.com/liuziyu/p/5733106.html