iOS 有四个任务ABCD,先执行AB,再执行CD

一道经典的面试题:有四个任务ABCD,先执行AB,再执行CD

首先推荐两位大牛写的关于多线程的文章 很不错
传送门一:https://www.jianshu.com/p/4b1d77054b35
传送门二:http://www.cocoachina.com/ios/20170829/20404.html

我感觉有五种方法吧(抛砖引玉哈):
1.0 串行即可:(这个简单 不贴代码了)

2.0利用GCD中的栅栏函数,代码如下:

-(void)doBarrier{
    dispatch_queue_t queue = dispatch_queue_create("com.test.sx", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"AAAAAA");
    });
    dispatch_async(queue, ^{
        NSLog(@"BBBBBB");
    });
    
    dispatch_barrier_sync(queue, ^{
        NSLog(@"");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"CCCCCC");
    });
    dispatch_async(queue, ^{
        NSLog(@"DDDDDD");
    });
}

3.0 利用GCD中的 队列组和notify

-(void)doGroupAndNotify{
    dispatch_group_t group = dispatch_group_create();
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"AAAAAA");
    });
    dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"BBBBBB");
    });
    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"CCCCCC");
    });
    dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"DDDDDD");
    });
}

4.0 利用 NSOperation 利用依赖

-(void)doDependency{
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    NSInvocationOperation *opInvocation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(taskopInvocation1) object:nil];
    NSInvocationOperation *opInvocation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(taskopInvocation2) object:nil];
    NSBlockOperation *opBlock1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"CCCCCC");
    }];
    NSBlockOperation *opBlock2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"DDDDDD");
    }];
    
    [opBlock1 addDependency:opInvocation1];
    [opBlock1 addDependency:opInvocation2];
    [opBlock2 addDependency:opInvocation1];
    [opBlock2 addDependency:opInvocation2];
    
    [queue addOperation:opInvocation1];
    [queue addOperation:opInvocation2];
    [queue addOperation:opBlock1];
    [queue addOperation:opBlock2];
    
}
-(void)taskopInvocation1{
    NSLog(@"AAAAA");
}
-(void)taskopInvocation2{
    NSLog(@"BBBBBB");
}

5.0 利用 NSOperation中的优先级属性:
这里需要注意两点:
任务的执行顺序除了和优先级有关系,还和依赖有关系,并且依赖是高于优先级的,什么意思呢,C 依赖于 B,C的优先级高于B,依然是B先执行。
优先级确定的是谁先开始执行,而非谁先结束执行!!!!

-(void)doPriority{
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    NSInvocationOperation *opInvocation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(taskopInvocation1) object:nil];
    NSInvocationOperation *opInvocation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(taskopInvocation2) object:nil];
    NSBlockOperation *opBlock1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"CCCCCC");
    }];
    NSBlockOperation *opBlock2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"DDDDDD");
    }];
    
    opInvocation1.queuePriority = NSOperationQueuePriorityHigh;
    opInvocation2.queuePriority = NSOperationQueuePriorityHigh;
    opBlock1.queuePriority = NSOperationQueuePriorityNormal;
    opBlock2.queuePriority = NSOperationQueuePriorityNormal;
    [queue addOperation:opInvocation1];
    [queue addOperation:opInvocation2];
    [queue addOperation:opBlock1];
    [queue addOperation:opBlock2];
}
-(void)taskopInvocation1{
    NSLog(@"AAAAA");
}
-(void)taskopInvocation2{
    NSLog(@"BBBBBB");
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,797评论 8 265
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 11,299评论 1 14
  • 一.概述 1.基本概念 同步与异步的概念 同步 必须等待当前语句执行完毕,才可以执行下一个语句。 异步 不用等待当...
    Jt_Self阅读 3,328评论 0 1
  • 1.介绍下内存的几大区域? 2.你是如何组件化解耦的? 3.runtime如何通过selector找到对应的IMP...
    小孩仔阅读 5,653评论 0 21
  • 环境 主机:Windows 10Hadoop:2.7.5Java:1.9 步骤 1. 确认Java已经安装,并已经...
    maxkibble阅读 14,183评论 1 7