NSOperation学习笔记

NSOperation(继承与NSOperation)

由于NSOperation该类是抽象类,因此您不直接使用它,而是使用子类或使用系统定义的子类之一(或)执行实际任务。
因此使用它的子类NSInvocationOperation和NSBlockOperation。

队列
// 获取主队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];

// 创建新队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

将NSOperation添加到队列中
1.
-(void)addOperation:(NSOperation *)op;

 NSOperationQueue *queue = [[NSOperationQueue alloc] init];
 
 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task1) object:nil];
 
 [queue addOperation:op1];

-(void)addOperationWithBlock:(void (^)(void))block;

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

[queue addOperationWithBlock:^{
        for (int i = 0; i < 2; i++) {
            [NSThread sleepForTimeInterval:2]; // 模拟耗时操作
            NSLog(@"1---%@", [NSThread currentThread]); // 打印当前线程
        }
    }];

NSInvocationOperation

在这里插入图片描述
NSInvocationOperation只有配合NSOperationQueue使用才能实现多线程,单独使用NSInvocationOperation不会开启新线程,默认在当前线程(指执行该方法的线程)中同步执行。
只有将添加到队列中, 才会异步执行

添加到队列中, 异步执行

在这里插入图片描述

NSBlockOperation

在这里插入图片描述
可以看出,NSBlockOperation创建时block中的任务是在主线程执行,而运用addExecutionBlock加入的任务是在子线程执行的。

依赖

NSOperation的操作依赖
NSOperation有一个非常好用的方法,就是操作依赖。可以从字面意思理解:某一个操作(operation2)依赖于另一个操作(operation1),只有当operation1执行完毕,才能执行operation2,这时,就是操作依赖大显身手的时候了。
测试代码

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 并发队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
    // 操作1
    NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 3; i++) {
            NSLog(@"operation1======%@", [NSThread  currentThread]);
        }
    }];
    
    // 操作2
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"****operation2依赖于operation1,只有当operation1执行完毕,operation2才会执行****");
        for (int i = 0; i < 3; i++) {
            NSLog(@"operation2======%@", [NSThread  currentThread]);
        }
    }];
    
    // 使操作2依赖于操作1
    [operation2 addDependency:operation1];
    // 把操作加入队列
    [queue addOperation:operation1];
    [queue addOperation:operation2];
}

运行结果

2019-12-15 00:32:31.457346+0800 blockTest[3726:138503] operation1======<NSThread: 0x600001755680>{number = 2, name = (null)}
2019-12-15 00:32:31.457517+0800 blockTest[3726:138503] operation1======<NSThread: 0x600001755680>{number = 2, name = (null)}
2019-12-15 00:32:31.457565+0800 blockTest[3726:138503] operation1======<NSThread: 0x600001755680>{number = 2, name = (null)}
2019-12-15 00:32:31.457752+0800 blockTest[3726:138504] ****operation2依赖于operation1,只有当operation1执行完毕,operation2才会执行****
2019-12-15 00:32:31.457930+0800 blockTest[3726:138504] operation2======<NSThread: 0x600001752fc0>{number = 3, name = (null)}
2019-12-15 00:32:31.457971+0800 blockTest[3726:138504] operation2======<NSThread: 0x600001752fc0>{number = 3, name = (null)}
2019-12-15 00:32:31.458001+0800 blockTest[3726:138504] operation2======<NSThread: 0x600001752fc0>{number = 3, name = (null)}

NSOperation与GCD的关系
  1. NSOperation是基于GCD进行封装的,面向对象的。GCD是基于C语言的。

  2. GCD只支持FIFO队列,NSOperationQueue可以方便设置执行顺序,设置最大的并发数量。

  3. NSOperationQueue可是方便的设置operation之间的依赖关系,GCD则需要很多代码。

  4. NSOperationQueue支持KVO,可以检测operation是否正在执行(isExecuted),是否结束(isFinished),是否取消(isCanceled)

  5. GCD的执行速度比NSOperationQueue快。

  6. 在NSOperationQueue中,可以建立各个NSOperation之间的依赖关系。

使用场合:

任务之间不太相互依赖:GCD

任务之间有依赖或要监听任务的执行情况:NSOperationQueue

基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问题(TSP)的代码+项目说明(课程大作业)+测试数据.zip 【备注】 1、该资源内项目代码百分百可运行,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值