多线程 - 09.NSOperation基本使用

1.概述

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

2.NSOperation的子类

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

3.NSInvocationOperation基本使用

  • 创建NSInvocationOperation对象,并且将任务封装到对象中
  • 执行封装的操作,利用start对象方法
// NSInvocationOperation基本使用
-(void)makeNSInvocationOperation{
    // 1.创建NSInvocationOperation对象,并且将任务封装到对象中
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo) object:nil];
    // 2.执行封装的操作
    // 如果直接执行NSInvocationOperation中的操作, 那么默认会在主线程中执行
    [operation start];

}
// 任务具体实现
-(void)demo{
    NSLog(@"%@",[NSThread currentThread]);
    // 输出结果:<NSThread: 0x7fc308c1d920>{number = 1, name = main}
}

4.NSBlockOperation基本使用

  • 创建NSBlockOperation,并且封装操作到block
  • NSBlockOperation可以额外再添加操作,不过额外添加的操作会在子线程中执行
-(void)blockOperation{
    // 1.1封装操作
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"1---%@",[NSThread currentThread]);
    }];
    // 1.2NSBlockOperation可以添加操作
    [operation addExecutionBlock:^{
        NSLog(@"2---%@",[NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        NSLog(@"3---%@",[NSThread currentThread]);
    }];
    /*输出结果:
     1---<NSThread: 0x7ffe3a5060f0>{number = 1, name = main}
     2---<NSThread: 0x7ffe3a611450>{number = 3, name = (null)}
     3---<NSThread: 0x7ffe3a41a910>{number = 2, name = (null)}
     */
    // 2.执行操作
    // 如果只封装了一个操作, 那么默认会在主线程中执行
    // 如果封装了多个操作, 那么除了第一个操作以外, 其它的操作会在子线程中执行
    [operation start];
}

5.自定义Operation

  • 要想使用自定义Operation,必须新建继承自NSOperation的类,并且重写main方法,添加自定义操作
// 自定义operation基本使用
-(void)customOperation{
    // 1.创建自定义operation
    // 如果是自定义类继承于NSOperation, 那么需要将操作写到自定义类的main方法中
    // 这种实现方式, 可以提高代码的复用性
    ZJOperation *op1 = [[ZJOperation alloc] init];
    // 执行操作
    [op1 start];

    ZJOperation *op2 = [[ZJOperation alloc] init];
    [op2 start];
}
    // 输出结果:
    // <NSThread: 0x7fde69700120>{number = 1, name = main}
    // <NSThread: 0x7fde69700120>{number = 1, name = main}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值