NSOperation是苹果在GCD的基础上封装,一套面向对象的多线程操作API。NSOperation是抽象基类,不能直接使用,系统为我们提供了NSInvocationOperation和NSBlockOperation两种子类来添加操作。此外,还可以自定义NSOperation子类来实现添加操作。
将创建好的操作,添加到队列(NSOperationQueue)中,即可实现多线程编程。
NSInvocationOperation
- (void)invocationOperation {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo1:) object:param1];
NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo2:) object:param2];
[queue addOperation:op1];
[queue addOperation:op2];
}
NSBlockOperation
- (void)blockOperation {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
// 想要执行的任务
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
// 想要执行的任务
}];
[queue addOperation:op1];
[queue addOperation:op2];
}
另外还有一种简单写法
[queue addOperationWithBlock:^{
// 想要执行的任务
}];
向操作中追加任务
[op addExecutionBlock:^{
// 想要追加的任务
}];
设置最大并发数
最大并发数,是指同时又多少条线程执行任务。
[queue setMaxConcurrentOperationCount:5];
当最大并发数设置为1时,任务顺序执行。
任务只是顺序执行,不能保证只开一条线程执行任务。
// 可以保证任务按照任务1 -> 任务2 -> 任务3的顺序执行
- (void)serialQueue {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue setMaxConcurrentOperationCount:1];
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
// 任务1
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
// 任务2
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
// 任务3
}];
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
}
队列操作
所有操作都只能作用在处于等待状态的任务,对已经在执行中的任务无效。
暂停
[queue setSuspended:YES];
恢复
[queue setSuspended:NO];
取消所有操作
[queue setSuspended:NO];
操作依赖
任务1必须在任务2执行完成之后执行
所有依赖添加操作只能在任务添加到队列之前执行。
- (void)dependency {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
// 任务1
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
// 任务2
}];
[op1 addDependency:op2];
[queue addOperation:op1];
[queue addOperation:op2];
}
操作监听
- (void)completion {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
// 任务1
}];
op.completionBlock = ^{
// 任务1执行完成
};
[queue addOperation:op];
}
线程间通信
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// UI操作
}];
自定义操作
实现自定义操作,继承自NSOperation
,重写main
方法,在main
方法中定义操作要执行的任务。
@interface DPLOperation : NSOperation
@end
#import "DPLOperation.h"
@implementation DPLOperation
- (void)main {
// 想要执行的任务
}
@end
注意:暂停任务等操作对自定义操作无效。
解决方法,利用isCancelled
属性,来监听任务是否被取消。
if (self.isCancelled) {
return;
}
网友评论