美文网首页
iOS GCD扩展用法

iOS GCD扩展用法

作者: 爱吃萝卜的小蘑菇 | 来源:发表于2017-09-05 16:14 被阅读22次

    GCD 延迟执行

    GCD 延迟执行
    //延迟执行
    -(void)delay
    {
        NSLog(@"start-----");
        
        //1. 延迟执行的第一种方法
        //[self performSelector:@selector(task) withObject:nil afterDelay:2.0];
        
        //2.延迟执行的第二种方法
        //[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(task) userInfo:nil repeats:YES];
        
        //3.GCD
    //    dispatch_queue_t queue = dispatch_get_main_queue();
         dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        /*
         第一个参数:DISPATCH_TIME_NOW 从现在开始计算时间
         第二个参数:延迟的时间 2.0 GCD时间单位:纳秒
         第三个参数:队列
         */
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), queue, ^{
            NSLog(@"GCD----%@",[NSThread currentThread]);
        });
    }
    -(void)task{
        NSLog(@"task----%@",[NSThread currentThread]);
    }
    

    GCD 一次性代码

    GCD 一次性代码
    //一次性代码
    //不能放在懒加载中的,应用场景:单例模式
    -(void)once
    {
        //整个程序运行过程中只会执行一次
        //onceToken用来记录该部分的代码是否被执行过
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            NSLog(@"---once----");
        });
    }
    

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

        dispatch_barrier_async(queue, ^{
            NSLog(@"--dispatch_barrier_async-");
        });
    

    其他

        //快速迭代(开多个线程并发完成迭代操作)
           dispatch_apply(subpaths.count, queue, ^(size_t index) {
        });
    
        //队列组(同栅栏函数)
        //创建队列组
        dispatch_group_t group = dispatch_group_create();
        //队列组中的任务执行完毕之后,执行该函数
        dispatch_group_notify(dispatch_group_t group,dispatch_queue_t queue,dispatch_block_t block);
    
        //进入群组和离开群组
        dispatch_group_enter(group);//执行该函数后,后面异步执行的block会被gruop监听
        dispatch_group_leave(group);//异步block中,所有的任务都执行完毕,最后离开群组
        //注意:dispatch_group_enter|dispatch_group_leave必须成对使用
    

    补充

    使用Crearte函数创建的并发队列和全局并发队列的主要区别:
    1.全局并发队列在整个应用程序中本身是默认存在的,并且对应有高优先级、默认优先级、低优先级和后台优先级一共四个并发队列,我们只是选择其中的一个直接拿来用。而Crearte函数是实打实的从头开始去创建一个队列。
    2.在iOS6.0之前,在GCD中凡是使用了带Crearte和retain的函数在最后都需要做一次release操作。而主队列和全局并发队列不需要我们手动release。当然了,在iOS6.0之后GCD已经被纳入到了ARC的内存管理范畴中,即便是使用retain或者create函数创建的对象也不再需要开发人员手动释放,我们像对待普通OC对象一样对待GCD就OK。
    3.在使用栅栏函数的时候,苹果官方明确规定栅栏函数只有在和使用create函数自己的创建的并发队列一起使用的时候才有效(没有给出具体原因)
    4.其它区别涉及到XNU内核的系统级线程编程,不一一列举。
    5.给出一些参考资料(可以自行研究):
    GCDAPI:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/c/func/dispatch_queue_create
    Libdispatch版本源码:http://www.opensource.apple.com/source/libdispatch/libdispatch-187.5/

    相关文章

      网友评论

          本文标题:iOS GCD扩展用法

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