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不同版本表现不同,以前直接死锁,目前版本会不调度。

posted @ 2016-08-25 15:55  三更小新  阅读(103)  评论(0编辑  收藏  举报