美文网首页
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