对NSOperation/NSOperationQueue的理解

来源:互联网 发布:贵州发展大数据带动 编辑:程序博客网 时间:2024/06/05 12:47

一、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
原创粉丝点击