iOS开发多线程NSOperation(四)

来源:互联网 发布:数据挖掘r语言实战微盘 编辑:程序博客网 时间:2024/05/17 20:22

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



0 0
原创粉丝点击