zoukankan      html  css  js  c++  java
  • 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;

     

    
    
    
    
    
     
  • 相关阅读:
    重构前的程序:通过rsync命令抓取日志文件
    标准输入、输出和错误和文件重定向
    错误处理的思考
    测试和恢复性的争论:面向对象vs.函数式编程
    哈佛经济学家关于工作效率的意外发现
    追求代码质量: 监视圈复杂度
    天猫程序猿高端算法找妹子
    代码度量工具——SourceMonitor的学习和使用
    我们能从java的HelloWorld学到什么?
    Java高新技术第二篇:反射技术
  • 原文地址:https://www.cnblogs.com/liuziyu/p/5733106.html
Copyright © 2011-2022 走看看