GCD的使用(三)

  为什么我总能猜到奇奇怪怪的事,今天有点不淡定了,做好自己,自信,(๑•̀ㅂ•́)و✧加油。

七 队列的循环、挂起、恢复

  dispatch_apply()函数是用来循环执行队列中的任务的,使用方式是dispatch_apply(循环次数,任务所在队列 {要循环执行的任务})。在串行队列中,会在当前线程中执行。在并行队列的时候,会开辟新的线程,不过有可能会在当前线程中执行一些任务。不管是并行还是串行,dispatch_apply都会阻塞当前线程。

    NSLog(@"循环多次执行串行队列");
    dispatch_queue_t serialQueue = [self getSerialQueue:"串行"];
    dispatch_apply(2, serialQueue, ^(size_t index) {
        
        [self currentThreadSleep:index];
        NSLog(@"第%zu次执行,%@",index,[self getCurrentThread]);
    });
    
    NSLog(@"循环多次执行并行队列");
    dispatch_queue_t concurrentQueue = [self getConcurrentQueue:"并行"];
    dispatch_apply(2, concurrentQueue, ^(size_t index) {
        
        [self currentThreadSleep:index];
        NSLog(@"第%zu次执行,%@",index,[self getCurrentThread]);
    });

  输出的结果为


队列的循环 2018-02-24 下午5.27.46.png

  下面的代码就是讲队列挂起和唤醒。

    dispatch_queue_t concurrentQueue = [self getConcurrentQueue:"并行"];
    
    //将队列进行挂起
    dispatch_suspend(concurrentQueue);
    
    dispatch_async(concurrentQueue, ^{
        NSLog(@"任务执行");
    });
    
    [self currentThreadSleep:2];
    
    //将挂起的队列唤醒
    dispatch_resume(concurrentQueue);

八 任务栅栏

  这个和任务组有点类似,将队列中的任务进行隔离,让任务能分拨的进行异步执行。从结果中可以看出,dispatch_barrier_async之前的任务会先异步执行,完成后执行栅栏中的任务块,当任务块执行完毕后,才会执行第二批任务。

    dispatch_queue_t concurrentQueue = [self getConcurrentQueue:"并行"];
    
    //第一批任务
    for (int i = 0 ; i < 3 ; i ++ )
    {
        dispatch_async(concurrentQueue, ^{
            [self currentThreadSleep:i];
            NSLog(@"第一批任务,%d,%@",i,[self getCurrentThread]);
        });
    }
    
    //添加栅栏
    dispatch_barrier_async(concurrentQueue, ^{
        NSLog(@"第一批执行完后才会执行第二批,%@",[self getCurrentThread]);
    });
    
    //第二批任务
    for (int i = 0 ; i < 3 ; i ++ )
    {
        dispatch_async(concurrentQueue, ^{
            [self currentThreadSleep:i];
            NSLog(@"第二批任务,%d,%@",i,[self getCurrentThread]);
        });
    }
任务栅栏 2018-02-24 下午5.30.18.png

  GCD定时器的应用在前面的iOS 实现红包雨中也提到了,GCD的用法也总结的差不多了,欢迎来查漏补缺。

你可能感兴趣的:(GCD的使用(三))