一、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看出, 这几个任务都是并行的。