NSOperation的简单使用

 NSOperation 是苹果大力推荐的"并发"技术

 NSOperation 的核心概念:将"操作"添加到"队列"

 GCD                  将"任务"添加到"队列"

 NSOperation类是一个抽象类

 特点:

   - 不能直接使用!

 目的:

   - 定义子类共有的属性和方法!

 子类:

   NSInvocationOperation

   NSBlockOperation

NSOperation  本质上就是对GCD的面向对象的封装

本质上 就是GCD的 异步执行任务的并发队列



NSInvocationOperation

代码逻辑多的话,建议使用,层次清晰

- (void)demo

{

 NSInvocationOperation* op = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(downLoad:) object:@"xiazai"];

 //start 方法 会在当前线程执行调度方法

  [op start];

 //队列

 NSOperationQueue* queue = [[NSOperationQueuealloc] init];

 //将操作添加到队列  -- 会自动异步执行调度方法

[queue addOperation:op];

}

NSBlockOperation 

所有代码都写在一起,便于维护

- (void)demo

{

    //1.队列

    NSOperationQueue * queue = [[NSOperationQueue alloc] init];

    //2.操作

    for(inti =0; i <10; i ++) {

        NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{

            NSLog(@"%@  %@",@(i),[NSThreadcurrentThread]);

        }];

        //3.添加到队列

        [queueaddOperation:op];

    }

}

线程间的通讯

- (void)demo

{

   NSOperationQueue * queue = [[NSOperationQueue alloc] init];

    [queue addOperationWithBlock:^{

        NSLog(@"子线程耗时操作:%@",[NSThreadcurrentThread]);

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{

            NSLog(@"更新UI:%@",[NSThreadcurrentThread]);

        }];

    }];

}

设置最大并发数

- (void)demo

{

    //设置同时最大的并发操作数量

    self.opQueue.maxConcurrentOperationCount = 2;

    //添加操作进队列

    /**

     从iOS 8.0 开始 ,无论是使用GCD还是NSOperation 都会开启多条线程

     在iOS 7.0 以前,GCD通常只会开启五六条线程

     目前线程多了 说明:

     1.底层的线程池更大了,能够拿到了线程资源更多了

     2.对控制同时并发的线程数要求更高了

     */

    for(inti =0; i <10; i ++) {

        [self.opQueue addOperationWithBlock:^{

            [NSThread sleepForTimeInterval:1.f];

            NSLog(@"%@  %d",[NSThreadcurrentThread],i);

        }];

    }

}

NSOPeration可以挂起队列  即暂停&继续

当挂起队列时,正在线程中执行的任务,不受影响

@property(getter=isSuspended)BOOL suspended;  设置BOOL值,YES为挂起队列,NO为继续

- (void)cancelAllOperations;  取消所有操作

@property(readonly)NSUInteger operationCount; 队列中的操作数,可以再队列挂起时判断操作数量

- (void)addDependency:(NSOperation*)op; 依赖于某个操作

- (void)removeDependency:(NSOperation*)op; 移除对某个操作的依赖

- (void)addOperations:(NSArray *)ops waitUntilFinished:(BOOL)wait; 把操作以数组的形式添加到队列中,并且是否等到操作完成.传YES的话 会卡住当前线程


  GCD & NSOperation对比

  GCD  在iOS 4.0 推出,主要针对多核处理器做了优化的并发技术,是C语言的

    - 将"任务"[Block]添加到 队列[串行/并发/主队列/全局队列],并指定执行任务的函数[同步/异步]

    - 线程间的通讯 通过dispatch_get_main_queue()拿到主线程

    - 提供了NSOperation不具备的一些功能

        -- 一次执行

        -- 延迟执行

        -- 调度组(在NSOperation中也可以做到,有点麻烦)

  NSOperation  在iOS 2.0 推出 面向对象,OC语言 苹果推出GCD之后,对NSOperation底层做了重写 底层也是GCD

    - 将"操作"[异步执行的任务]  添加到队列[并发队列], 就会立刻异步的执行

    - 线程间的通讯 通过 mainQueue类方法

    - 提供了一些GCD实现起来,比较困难的功能

        -- 最大并发线程

        -- 队列的暂停/继续

        -- 取消所有的操作

        -- 指定操作之间的依赖关系(GCD 用同步来实现)

你可能感兴趣的:(NSOperation的简单使用)