NSOperation 可以实现多线程 是一个抽象类 不能直接使用 实现的手段通过该类的子类 NSInvocationOperation NSBlockOperation 实现多线程
NSInvocationOperation 在创建任务时 用一个方法来表示 任务必须放在任务队列中管理 队列保持任务以先进先出的顺序
NSBlockOperation 创建任务时 用一个block来表示
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//1.NSInvocationOperation
NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printA) object:nil];
//operation1代表了任务printA
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(printB) object:nil];
//operation2代表了任务printB
//2.NSBlockOperation
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
[self printC];
}];
// blockOperation代表任务printC
//3.创建任务 需要加到任务队列中管理 NSOperationQueue 任务队列 管理多个任务的
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//设置任务的最大并发数(最多的时候有几个任务同时进行)
queue.maxConcurrentOperationCount = 4;
//B添加依赖 依赖于A 添加依赖 需要写在加入队列之前
[operation2 addDependency:operation1];
[blockOperation addDependency:operation2];
/*
//C--> A -->B
//A依赖于C B依赖于A
[operation1 addDependency:blockOperation];
[operation2 addDependency:operation1];
*/
//给队列添加任务
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:blockOperation];
//【注意】任务需要加入队列才能执行 否则没有效果
//如果需要将某些任务排序 按照一个固定的顺序执行 可以添加任务间的依赖关系
//A-->B B的执行先决条件是A执行了 B依赖于A
//希望取消任务 任务会终止 如果任务已经开始了
// [queue cancelAllOperations];
//主线程管理任务的主队列 应用程序启动 也会有
//获取主队列
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
NSLog(@"%@",mainQueue);
// [self mainPrint]; 说明 在生命周期的方法中调用的任务 都是添加到主队列中管理的
//获取当前对列
NSOperationQueue *currentQueue = [NSOperationQueue currentQueue];
//给队列命名(可以用于判断当前执行的是哪一个队列中的方法 主队列名字@“NSOperationQueue main queue”)
// queue.name = @"MY_QUEUE";
}
- (void)mainPrint{
NSOperationQueue *currentQueue = [NSOperationQueue currentQueue];
NSLog(@"%@",currentQueue);
//主队列
}
- (void)printA{
for (int i = 0; i < 5; i++) {
NSLog(@"AAAAAAA");
}
}
- (void)printB{
for (int i = 0; i < 5; i++) {
NSLog(@"BBBBBBBB");
}
}
- (void)printC{
for (int i = 0; i < 5; i++) {
NSLog(@"CCCCCCC");
}
}