对NSOperation/NSOperationQueue的理解

一、NSOperation、NSOperationQueue

1.概述:

NSOperation的作用是实现多线程编程。

NSOperation与NSOperationQueue实现多线程编程的基本步骤为:

(1)先将一个需要的操作封到NSOperation中。

(2)将NSOperation添加到NSOperationQueue中。

(3)系统自动将NSOperationQueue的NSOperation取出。

(4)NSOperation中封装的操作会被放到一条新线程上执行。

2.注意:

NSOperation如同NSObject一样,是个抽象类,所以你必须使用继承于它的子类去封装你需要的操作。

使用子类有3中:

(1)NSInvocationOperation

(2)NSBlockOperation

(3)自定义继承于NSOperation的子类,实现方法。

二、代码实现

1.NSInvocationOperation

- (void)viewDidLoad {
    [super viewDidLoad];
    // 创建对象 封装操作
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(testAction) object:nil];
    // 执行操作 一旦开始操作会调用testAction
    [operation start];
}

- (void)testAction
{
    NSLog(@"---%@---", [NSThread currentThread]);
}

执行结果:


***操作对象默认在主线程运行, 在添加到队列后会开辟新的线程。即默认下都是同步执行,放到NSOperationQueue中才会异步执行。

2.NSBlockOperation

- (void)viewDidLoad {
    [super viewDidLoad];
    // 创建NSBlockOperation操作对象
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"---%@---", [NSThread currentThread]);
    }];
    [operation start];
}

// 添加操作
    [operation addExecutionBlock:^{
        NSLog(@"test2%@", [NSThread currentThread]);
    }];

执行结果:


***只要block中封装的操作数量大于1就会异步执行。

3.NSOperationQueue

NSOperationQueue的作用是将NSOperation添加到操作队列中,系统会自动异步执行。

- (void)viewDidLoad {
    [super viewDidLoad];
    // 创建NSInvocationOperation对象
    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(testAction) object:nil];
    // block方式创建
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"test2%@", [NSThread currentThread]);
    }];
    // 创建NSOperationQueue
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    // 把操作添加到队列中
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    // 另一种添加到队列方式
    [queue addOperationWithBlock:^{
        NSLog(@"test3%@", [NSThread currentThread]);
    }];
}

- (void)testAction
{
    NSLog(@"test1%@", [NSThread currentThread]);
}

执行结果:


***可以从任务的时间090看出, 这几个任务都是并行的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值