NSOperation
(1)是一个抽象类,不可以直接使用。抽象类是定义所有子类共用的方法和属性。子类是NSInvocationOperation和NSBlockOperation。队列有NSOperationQueue。
(2)GCD是将任务(GCD)添加到队列,并且指定执行任务的函数。OP是将操作添加到队列,都是OC对象,不在定义Block。
[queue addOperation] 将操作添加到队列就是直接异步并发。
(3)所以用OP应该定义一个全局的queue,管理所有的异步操作。然后懒加载....所有的NSOP子类都可以添加到队列中都是异步执行的。
(4)线程间通讯:
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { // 线程间通讯 [self.queue addOperationWithBlock:^{ NSLog(@"耗时操作%@",[NSThread currentThread]); // 主线程更新 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"主线程更新%@",[NSThread currentThread]); }]; }]; }
(5) OP高级功能GCD很难实现。
1.最大操作数 : 就算设置了2,为啥还有10,11线程?因为底层线程池用完会有一个回收的过程,在回收的过程中可以获得其他可用的线程,提高开发效率。所谓setMaxConcurrentCount = 2只表示 同时最多俩线程再跑。但是总线程可以很多。
2.暂停继续: queue有一个suspected挂起属性。而且挂起的是队列,不会影响执行中的操作。所以挂起后,还会有操作执行(因为它正在执行)。queue还有操作数,取消全部操作等属性。但是取消操作不能取消正在执行的操作。要取消正在执行的需要自定义操作。系统自带的是不行的。
3.依赖关系: GCD的依赖是barrier或者是同步。
OP中:一个操作 addDependency 另一个操作,前者需要后者执行完毕执行。这里的性能要比GCD好,因为线程不止一条,可以重用。并发的。依赖关系可以跨队列。主,golbal可以混用。
循环依赖在IOS不同版本表现不同,以前直接死锁,目前版本会不调度。