iOS学习笔记-113.多线程12——NSOperation基础

多线程12——NSOperation基础

一、简介

1.1 NSOperation的作用

配合使用 NSOperationNSOperationQueue 也能实现多线程编程

1.2 实现多线程的步骤

NSOperation和NSOperationQueue实现多线程的具体步骤

先将需要执行的操作封装到一个 NSOperation 对象中

然后将 NSOperation 对象添加到NSOperationQueue

系统会自动将 NSOperationQueue 中的 NSOperation 取出来

将取出的 NSOperation 封装的操作放到一条新线程中执行


二、NSOperation子类使用的三种方式

NSOperation 是个抽象类,并不具备封装操作的能力,必须使用它的子类

使用NSOperation子类的方式有3种

  1. NSInvocationOperation

  2. NSBlockOperation

  3. 自定义子类继承NSOperation,实现内部相应的方法


三、NSInvocationOperation

3.1 创建 NSInvocationOperation 对象

- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

3.2 调用start方法开始执行操作

- (void)start;
调用start方法开始执行操作

==注意==

默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作

==只有将 NSOperation 放到一个 NSOperationQueue 中,才会异步执行操作==


四、NSInvocationOperation简单使用

==只有将 NSOperation 放到一个 NSOperationQueue 中,才会异步执行操作==

下面我们使用的是不添加到 NSOperationQueue 中,那么我们应该得到的结果是,在同一个线程也就是主线程中运行的,而不会创建新的线程。

4.1 示例代码

/*NSInvocationOperation不使用 NSOperationQueue 这种方式和直接调用是一样的*/
-(void)invocationOperation{
    //1.创建操作,封装任务
    /*
     第一个参数:目标对象 self
     第二个参数:调用方法的名称
     第三个参数:前面方法需要接受的参数
     */
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:@"download1"];
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:@"download2"];
    NSInvocationOperation *op3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:@"download3"];

    //2启动执行任务
    [op1 start];
    [op2 start];
    [op3 start];
}

/*下载*/
-(void)download:(NSString*)params{
    NSLog(@"--%@----%@",params,[NSThread currentThread]);
}

4.2 运行结果

[5142:28334] --download1----<NSThread: 0x608000071f40>{number = 1, name = main}
[5142:28334] --download2----<NSThread: 0x608000071f40>{number = 1, name = main}
[5142:28334] --download3----<NSThread: 0x608000071f40>{number = 1, name = main}

4.3 结果分析

我们发现 不会开启新的线程,和我们直接调用是一样的

[self download:@"download1"];

这是因为
==只有将 NSOperation 放到一个 NSOperationQueue 中,才会异步执行操作==


五、NSBlockOperation

5.1 创建NSBlockOperation对象

+ (id)blockOperationWithBlock:(void (^)(void))block;

5.2 通过addExecutionBlock:方法添加更多的操作

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

==注意:只要 NSBlockOperation 封装的操作数 > 1,就会异步执行操作==


六、NSBlockOperation 简单使用

==注意:只要 NSBlockOperation 封装的操作数 > 1,就会异步执行操作==

如果我们创建了多个 NSBlockOperation 并且每个 NSBlockOperation只添加了任务,其次它没有添加到 NSOperationQueue中,那么是不会异步执行的。

6.1 示例代码

/*NSBlockOperation */
-(void)blockOperation{
    //1.创建操作
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
      NSLog(@"1----%@",[NSThread currentThread]);
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"2----%@",[NSThread currentThread]);
    }];
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"3----%@",[NSThread currentThread]);
    }];

    //追加任务
    //注意:如果一个操作中的任务数量大于1,那么会开子线程并发执行任务
    //注意:不一定是子线程,有可能是主线程
    [op3 addExecutionBlock:^{
        NSLog(@"4----%@",[NSThread currentThread]);
    }];
    [op3 addExecutionBlock:^{
        NSLog(@"5----%@",[NSThread currentThread]);
    }];

    //3.启动
    [op1 start];
    [op2 start];
    [op3 start];
}

6.2 运行结果

[7168:37119] 1----<NSThread: 0x600000065940>{number = 1, name = main}
[7168:37119] 2----<NSThread: 0x600000065940>{number = 1, name = main}
[7168:37119] 3----<NSThread: 0x600000065940>{number = 1, name = main}
[7168:37214] 4----<NSThread: 0x6000000733c0>{number = 3, name = (null)}
[7168:37215] 5----<NSThread: 0x600000072fc0>{number = 4, name = (null)}

6.3 结果分析

在操作1和操作2(op1,op2)中我们只添加了一个任务,那么它是不具备并发的可能性的。op3中我们添加了3个任务,它并发了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值