美文网首页
NSOperationQueue的学习

NSOperationQueue的学习

作者: jianshu小赵 | 来源:发表于2017-08-16 17:17 被阅读12次

    简介

    NSOperationQueue是一种面向对象的处理线程工作的技术,在gcd 式的函数式编程上进行的封装,并联合kvo 对一些状态做了监听,同时加入了依赖等操作,使得开发中在操作程序流程控制上更加省事。

    NSOperation的操作类

    1. NSOperation

       这个类是用于定义自定义操作对象的基类,子类化NSOperation可以完全控制您自己的操作的实现,包括更改操作执行的默认方式并报告其状态的能力。
    

    2.NSInvocationOperation

       一个你同时使用一个或多个block对象的类。因为它可以执行多个block,block操作对象使用组语义进行操作; 只有当所有关联的block完成执行时,操作本身被认为完成。
    

    3.NSInvocationOperation

        您根据应用程序创建基于对象和选择器的操作对象的类,简言之,类似于UIbutton的target那种操作 
    

    所有操作对象都支持以下主要功能:
    1,支持在操作对象之间建立基于图形的依赖关系。这些依赖关系阻止给定的操作运行,直到其所依赖的所有操作完成运行
    2,支持可选的completion block,该操作在操作的主要任务完成后执行
    3,支持优先操作,从而影响其相对执行顺序 也就是支持操作的优先级
    4,支持 cancel setSuspended 等
    5,支持使用KVO通知监视对您的操作执行状态的更改,kvo监听到你操作的进程
    

    创建Operation对象

    1. 创建NSInvocationOperation对象
    - (NSOperation*)taskWithData:(id)data {
        NSInvocationOperation* theOp = [[NSInvocationOperation alloc] initWithTarget:self
                        selector:@selector(myTaskMethod:) object:data];
     
       return theOp;
    }
    
    // This is the method that does the actual work of the task.
    - (void)myTaskMethod:(id)data {
        // Perform the task.
    }
    
    
    2.创建NSBlockOperation对象
    NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
          NSLog(@"Beginning operation.\n");
          // Do some work.
       }];
       
    

    执行Operations

        到目前为止,执行操作的最简单的方法是使用作为NSOperationQueue类的一个实例的操作队列。您的应用程序负责创建和维护其打算使用的任何操作队列。应用程序可以具有任意数量的队列,但是在给定时间点可能执行多少操作有实际的限制。操作队列与系统一起工作,将并发操作数限制为适用于可用内核和系统负载的值。因此,创建其他队列并不意味着您可以执行其他操作。要创建一个队列,您可以像应用其他对象一样在应用程序中分配队列:
    
    
    NSOperationQueue * aQueue = [[NSOperationQueue alloc] init];//创建队列
    
    
       要将操作添加到队列中,请使用该addOperation:方法。在OS X v10.6及更高版本中,您可以使用该addOperations:waitUntilFinished:方法添加一组操作,也可以使用该方法将块对象直接添加到队列中(不带相应的操作对象)addOperationWithBlock:。这些方法中的每一个都会排队一个操作(或操作),并通知队列应该开始处理它们。在大多数情况下,在添加到队列后不久就会执行操作,但由于几个原因,操作队列可能会延迟执行排队操作。具体来说,如果排队操作依赖于尚未完成的其他操作,则可能会延迟执行。如果运行队列本身被挂起或正在执行其最大并发操作数,则执行也可能会被延迟。
        // 把operation添加到队列中 的三种方式
        [aQueue addOperation:anOp]; //添加单个操作
        [aQueue addOperations:anArrayOfOpswaitUntilFinished:NO]; //添加多个操作
        [aQueue addOperationWithBlock:^ {
       /* 做一点事。* /
         }];
    

    operation之间的依赖

    1.当某个NSOperation对象依赖于其它NSOperation对象的完成时,就可以通过addDependency方法添加一个或者多个依赖的对象,只有所有依赖的对象都已经完成操作,当前NSOperation对象才会开始执行操作。注意:不要造成循环依赖 如果A依赖B, B依赖A 结果会是如何,你懂得。另外,通过removeDependency方法来删除依赖对象。
    
    D0F77D00-6964-4719-8634-51374B142F96.png 72B6D054-5DDE-431D-A491-E74B90064C9E.png

    设置最大并发操作数

    虽然NSOperationQueue该类是为并行执行操作而设计的,但是可以强制单个队列一次只运行一个操作。该setMaxConcurrentOperationCount:方法允许您配置操作队列对象的最大并发操作数

    [aQueue setMaxConcurrentOperationCount:1];//设置队列的最大并发操作数量
    
    

    取消操作 和 等待操作完成

      [aQueue cancelAllOperations];//取消队列里的所有操作
      [operation1 cancel];//本操作取消
      
     // 阻塞当前线程,等待queue的所有操作执行完毕
        [queue waitUntilAllOperationsAreFinished];
    
    

    本文只是记录了简单的使用 介绍 可参考官方文档https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW1
    可以看看AFN GCDAsyncSockcet 等三方库中的应用

    相关文章

      网友评论

          本文标题:NSOperationQueue的学习

          本文链接:https://www.haomeiwen.com/subject/fbprlxtx.html