美文网首页
NSOperation

NSOperation

作者: Iris_Fighting | 来源:发表于2016-04-21 13:48 被阅读393次

    NSOperation简介

    • 是OC语言中基于GCD的面向对象的封装
    • 使用起俩比GCD更加简单
    • 提供了一些用GCD不好实现的功能
    • 苹果推荐使用,使用NSOperation不用关心线程以及线程的生命周期问题
    • NSOperation是一个抽象类,不能直接使用(方法没有实现)
    • 约束子类都有共同的属性和方法
    • NSOperation的子类

    1.NSInvocationOperation 2.NSBlockOperation 3.自定义operation

    • NSOperationQueue队列

    使用步骤

    NSOperation和 NSOperationQueue是实现多线程的具体步骤:
    1.先将需要执行的操作封装到一个NSOperation对象汇总
    2.将NSOperation对象添加到NSOperationQueue中
    系统会自动将NSOperationQueue中的NSOperation取出来
    将去出来的NSOperation封装的操作放在一条新线程中执行
    PS:队列先进先出

    NSInvocationOperation

    NSBlockOperation

    自定义operation


    NSOperationQueue

    1.NSOperationQueue的作用:NSOperation可以调用start方法来执行任务,但默认是同步执行.如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作.

    2.添加到NSOperationQueue中
    - (void)addOperation:(NSOperation *)op;
    - (void)addOperationWithBlock:(void (^)(void))block NS_AVAILABLE(10_6, 4_0);

    - (void)addOperations:(NSArray<NSOperation *> *)ops waitUntilFinished:(BOOL)wait NS_AVAILABLE(10_6, 4_0);

    线程间通讯

    1.主队列

    • 添加到主队列的操作,最终都执行在主线程
    • [NSOperationQueue currentQueue];
      2.当前队列
    • 获取当前操作所在的队列
      [NSOperationQueue mainQueue];

    GCD VS NSOperation

    • GCD是iOS4推出的,主要针对多核CPU做了优化,C语言技术
    • GCD是将任务(block)添加到队列中(串行/并行/全局/主队列),并且以同步/异步的方式执行任务的函数
    • GCD提供了一些NSOperation不具备的功能
      • 一次性执行
      • 延时执行
      • 调度组
    • NSOperation
    • NSOperation是iOS2.0推出的,iOS4之后重写了NSOperation
    • NSOperation是将操作(异步的任务)添加到队列(并发队列),就会执行指定的操作函数
    • NSOperation提供方便操作
      • 最大并发数
      • 队列中的暂停/继续
      • 取消所有的操作
      • 指定操作之间的依赖关系(GCD中可以用同步实现)

    队列的最大并发数:

    • 同时执行的任务数量,比如同时开3个线程执行3个任务,并发数就是3
    • 相关方法:@property NSInteger maxConcurrentOperationCount;
      例子
      NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue setMaxConcurrentOperationCount:8]; queue.maxConcurrentOperationCount = 8;

    队列的暂停/取消/恢复:

    • 取消队列的所有操作:
      - (void)cancelAllOperations;
    • 暂停和恢复队列的操作
      @property (getter=isSuspended) BOOL suspended;
      YES代表队列暂停,NO代表恢复队列
      暂停是当前正在执行的操作会继续执行下去,暂停后续的操作,取消原理也是如此.

    优先级与服务质量

    • 设置NSOperation在queue中的优先级,可以改变操作的执行优先级
      typedef NS_ENUM(NSInteger, NSOperationQueuePriority) { NSOperationQueuePriorityVeryLow = -8L, NSOperationQueuePriorityLow = -4L, NSOperationQueuePriorityNormal = 0, NSOperationQueuePriorityHigh = 4, NSOperationQueuePriorityVeryHigh = 8 }; @property NSOperationQueuePriority queuePriority;
    • iOS8以后推荐使用qualityOfService

    相关文章

      网友评论

          本文标题:NSOperation

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