美文网首页
iOS多线程篇-GCD常用方法的使用

iOS多线程篇-GCD常用方法的使用

作者: LitterL | 来源:发表于2016-01-12 22:11 被阅读183次

    延迟执行

    //第一个参数:dispatch_time_t when     时间
    //第二个参数:dispatch_queue_t queue   队列
    //第三个参数:dispatch_block_t block   执行的block
    
    //这段代码的含义为:让主队列延迟两秒打印LitterL
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        NSLog(@"LitterL");
    });
    
    

    一次性执行

    //第一个参数:dispatch_once_t *predicate  记录代码是否被执行过  默认为0  但执行一次后就是-1了  所以就看到智能执行一次的这个效果
    //第二个参数:dispatch_block_t block 执行的block
    _dispatch_once(dispatch_once_t *predicate, dispatch_block_t block)
    {
        if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
            dispatch_once(predicate, block);
        }
    }
    
    //-------------------实例---------------------
     -(void)once
        {
            //整个程序运行过程中只会执行一次
            //onceToken用来记录该部分的代码是否被执行过
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                NSLog(@"LitterL");
            });
        }
    

    栅栏函数(控制任务的执行顺序)

    //栅栏函数
    
    //第一个参数 dispatch_queue_t 队列
    //第二个参数 dispatch_block_t 执行的block
    //作用:在我们需要控制任务的顺序的时候可以使用栅栏函数,进行控制
    dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
    
    //-------------------------实例---------------------------
    //
    //      不管怎么输出,我的1-X、2-X都是在上面,而不是随意乱输出
    //
    -(void)barrier
    {
        //1.获得队列
        dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
    
        //2.异步函数
        dispatch_async(queue, ^{
    
            for (NSInteger i =0; i<10; i++) {
                   NSLog(@"1-%zd--%@",i,[NSThread currentThread]);
            }
    
        });
    
        dispatch_async(queue, ^{
            for (NSInteger i =0; i<10; i++) {
                NSLog(@"2-%zd--%@",i,[NSThread currentThread]);
            }
        });
    
        //栅栏函数:控制并发队列中任务的执行顺序
        dispatch_barrier_async(queue, ^{
            NSLog(@"+++++++++++++++++++++++++++");
        });
    
        dispatch_async(queue, ^{
            for (NSInteger i =0; i<10; i++) {
                NSLog(@"3-%zd--%@",i,[NSThread currentThread]);
            }
        });
    
        dispatch_async(queue, ^{
            for (NSInteger i =0; i<10; i++) {
                NSLog(@"4-%zd--%@",i,[NSThread currentThread]);
            }
        });
    
    }
    

    快速迭代

    -(void)test
    {
        //1.获得并发队列
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
        //2.快速迭代
        /*
         第一个参数:要迭代的次数
         第二个参数:队列,并发队列
         第三个参数:block 封装任务
         */
        dispatch_apply(10, queue, ^(size_t index) {
            NSLog(@"%zd----%@",index,[NSThread currentThread]);
        });
    
    }
    

    队列组

    -(void)group
    {
        //0.创建队列组
        dispatch_group_t group = dispatch_group_create();
    
        //1.创建队列
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
        //2.异步函数
        /*
         1)封装任务
         2)把任务添加到队列中
         3)监听任务的执行情况,group
         */
        dispatch_group_async(group, queue, ^{
              NSLog(@"download1---%@",[NSThread currentThread]);
        });
    
         dispatch_group_async(group, queue, ^{
            NSLog(@"download2---%@",[NSThread currentThread]);
        });
    
         dispatch_group_async(group, queue, ^{
            NSLog(@"download3---%@",[NSThread currentThread]);
        });
    
        //3.当队列组中所有的任务都执行完毕之后会通知group执行dispatch_group_notify方法
        dispatch_group_notify(group, queue, ^{
            NSLog(@"队列组中所有的任务都执行完毕了");
        });
    }
    

    结束

                      本章到此结束
                欢迎各位码友随意转载并指正

    相关文章

      网友评论

          本文标题:iOS多线程篇-GCD常用方法的使用

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