NSOperation(线程)

简介

  • NSOperation作用
    NSOperation和NSOperationQueue也能实现多线程编程
  • NSOperation和NSOperationQueue实现多线程的具体步骤
    先将需要执行的操作封装到一个NSOperation对象中
    然后将NSOperation对象添加到NSOperationQueue中
    将取出的NSOperation封装的操作放到一条新线程中执行

NSOperation的子类

  • NSOperation是个抽象类,并不具备封装操作的能力,必须使用他的子类
  • 使用NSOperation子类的方式有3种
    1.NSInvocationOperation
    2.NSBlockOperation
    3.自定义类继承NSOperation,实现内部相应的方法

使用(没有配合队列使用,没有开启子线程)

第一种 NSInvocationOperation

  • 第一个参数:目标对象 self
  • 第二个参数:调用方法的名称
  • 第三个参数:前面方法需要接受的参数 nil
    1.创建操作,封装任务
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>];

2.启动|执行操作

[op1 start];

第二种 NSBlockOperation

1.创建操作

  NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        <#code#>
    }];
    
 NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        <#code#>
    }];
    
 NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        <#code#>
    }];

2.追加任务(开启子线程)
//注意:如果一个操作中的任务量大于1,那么会开子线程并发执行任务
//注意:不一定是子线程,有可能是主线程

[op1 addExecutionBlock:^{
        <#code#>
    }];
    
[op2 addExecutionBlock:^{
        <#code#>
    }];
    
[op3 addExecutionBlock:^{
        <#code#>
    }];

3.启动|执行操作

[op1 start];

配合队列使用(开启子线程)

NSOperation:
主队列:[NSOperationQueue mainQueue] 和GCD中的主队列一样,串行队列
非主队列:[[NSOperationQueue alloc] init] 非常特殊(同时具备并发和串行的功能)
//默认情况下,非主队列是并发队列

第一种 NSInvocationOperation

  • 第一个参数:目标对象 self
  • 第二个参数:调用方法的名称
  • 第三个参数:前面方法需要接受的参数 nil
    1.创建操作,封装任务
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>];

NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:<#(nonnull id)#> selector:<#(nonnull SEL)#> object:<#(nullable id)#>];

2.创建队列

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

3.添加操作到队列中

[queue addOperation:op1];  //内部已经调用了[op1 start];---->main方法
[queue addOperation:op2];

第二种 NSBlockOperation

1.创建操作

  NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        <#code#>
    }];
    
 NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        <#code#>
    }];
    
 NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        <#code#>
    }];

追加任务(开启子线程)
//注意:如果一个操作中的任务量大于1,那么会开子线程并发执行任务
//注意:不一定是子线程,有可能是主线程

[op1 addExecutionBlock:^{
        <#code#>
    }];
    
[op2 addExecutionBlock:^{
        <#code#>
    }];
    
[op3 addExecutionBlock:^{
        <#code#>
    }];

2.创建队列

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

3.添加操作到队列中

[queue addOperation:op1];  //内部已经调用了[op1 start];
[queue addOperation:op2];
[queue addOperation:op3];

简便方法

1)创建操作
2)添加操作到队列中

[queue addOperationWithBlock^{
   <#code#>
}];

线程间通信

直接嵌套就好,利用主队列创建任务,任务就会在主队列中执行

[[NSOperationQueue mainQueue] addOperationWithBlock:^{
  
}];
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iOS开发疯狂者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值