NSOperationQueue—总结

@interface ViewController ()
/** 全局操作队列,调用所有的异步操作 */
@property (nonatomic, strong) NSOperationQueue *opQueue;
@end

@implementation ViewController
/**
 NSOperation 是苹果公司大力推荐的"并发"技术!程序员已经不在需要关心线程以及线程的生命周期!
 
 NSOperation 的核心概念:将"操作"添加到"队列"
 GCD 的核心概念:将"任务"添加到队列,指定任务的执行函数(方法)
 
 ---
 GCD & NSOperation 的对比
 
 GCD 在 iOS 4.0 推出的,主要针对多核处理器做了优化的并发技术,是 C 语言的
    -将"任务[block]"添加到"队列[串行/并发/主队列/全局队列]",并且指定执行任务的函数[同步/异步]
    -线程间通讯 dispatch_get_main_queue()
    -提供了一些 NSOperation 不具备的功能
        - 一次性执行
        - 延迟执行
        - 调度组(在op中也可以做到,就是有点麻烦)
 
 NSOperation 在 iOS 2.0 推出的,苹果推出 GCD 之后,对 NSOperation 底层重写了一遍
    -将操作[异步执行的任务]添加到队列[并发队列],就会立即异步执行
    -mainQueue
    -提供了一些 GCD 实现起来比较困难的功能!
        - 最大并发操作数
        - 队列的暂停/继续
        - 取消所有操作
        - 指定操作之间的依赖关系 (GCD 用同步实现)
 
 ---
 NSOperation 类是一个抽象类
 特点:
    - 不能直接使用!
 目的:
    - 定义子类共有的属性和方法
 
 子类
    - NSInvocationOperation
    - NSBlockOperation
 
 - UIGestureRecognizer
 - CAAnimation
    - CAPropertyAnimation
        - BASIC
        - Keyframe
 
 */

- (NSOperationQueue *)opQueue {
    if (_opQueue == nil) {
        _opQueue = [[NSOperationQueue alloc] init];
    }
    return _opQueue;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self demo6];
}

// MARK: 线程间通讯
- (void)demo6 {
    [self.opQueue addOperationWithBlock:^{
        NSLog(@"耗时的操作 %@", [NSThread currentThread]);
        
        // 主线程更新UI,主队列
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"UIUIUI --- %@", [NSThread currentThread]);
        }];
    }];
}

// MARK: 全局队列 - 只要是 NSOpeation 的子类,都可以添加到队列!
- (void)demo5 {
    // 直接添加任务
    for (int i = 0; i < 10; i++) {
        [self.opQueue addOperationWithBlock:^{
            NSLog(@"%@ --- %d", [NSThread currentThread], i);
        }];
    }
    
    // block operation 同样可以添加到队列
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"BLOCK ---- %@ ---- %d ", [NSThread currentThread], 100);
    }];
    [self.opQueue addOperation:op1];
    
    // invocation operation
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"invocation"];
    [self.opQueue addOperation:op2];
}

// MARK: 更简单的
- (void)demo4 {
    // 1. 队列 -> 队列如果每次分配会比较浪费!
    // 在实际开发中,会使用全局的队列,统一调度所有异步执行的操作
    NSOperationQueue *q = [[NSOperationQueue alloc] init];
    
    // 2. 添加操作
    for (int i = 0; i<10; i++) {
        [q addOperationWithBlock:^{
            NSLog(@"%@ --- %d", [NSThread currentThread], i);
        }];
    }
}

// MARK: NSBlockOperation 演练
// NSBlockOperation 所有的代码都写在一起,更加好维护
- (void)demo3 {
    // 1. 队列
    NSOperationQueue *q = [[NSOperationQueue alloc] init];
    
    // 2. 操作
    for (int i = 0; i<10; i++) {
        NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"%@ ---- %d ", [NSThread currentThread], i);
        }];
        
        [q addOperation:op];
    }
}

// MARK: NSInvocationOperation演练
/**
 结果:开启多个线程,不会顺序执行 -> GCD 并发队列,异步执行任务
 
 NSOperation 本质上是对 GCD 的面相对象的封装
 
 - 队列:本质上就是 GCD 的并发队列
 - 操作:异步执行的任务
 */
- (void)demo2 {
    // 1. 队列
    NSOperationQueue *q = [[NSOperationQueue alloc] init];
    
    for (int i = 0; i < 10; i++) {
        NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@(i)];
        
        // 添加到队列
        [q addOperation:op];
    }
}

- (void)demo1 {
    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:@"invocation"];
    
    // start 方法,会在当前线程执行调度方法
//    [op start];
    // 队列
    NSOperationQueue *q = [[NSOperationQueue alloc] init];
    // 将操作添加到队列 - 会自动异步执行调度方法
    [q addOperation:op];
}

- (void)downloadImage:(id)obj {
    NSLog(@"%@ %@", [NSThread currentThread], obj);
}

@end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值