美文网首页
iOS 有四个任务ABCD,先执行AB,再执行CD

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

作者: 封丑儿 | 来源:发表于2018-11-27 16:11 被阅读38次

    一道经典的面试题:有四个任务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");
    }
    

    相关文章

      网友评论

          本文标题:iOS 有四个任务ABCD,先执行AB,再执行CD

          本文链接:https://www.haomeiwen.com/subject/phogqqtx.html