iOS开发多线程NSOperation(四)

好久不见. 提交于 2019-12-05 20:10:11

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");
    }
}



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!