美文网首页
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扩展用法

    GCD 延迟执行 GCD 一次性代码 栅栏函数(控制任务的执行顺序) 其他 补充 使用Crearte函数创建的并发...

  • GCD

    iOS多线程 Swift4 GCD深入解析swift GCD 的一些高级用法GCD 之线程组(Dispatch G...

  • iOS多线程

    iOS多线程实现方案 GCD(Grand Central Dispatch) 一、基本用法GCD会自动利用更多的C...

  • iOS多线程之GCD浅析

    本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法,分析GCD的原理,总结GCD的用法和需要注意的地方...

  • iOS GCD用法

    本人记性不太好,总是记不住GCD的一些用法,干脆直接写下来,省的每次都百度搜了,这个转自 :http://www....

  • [Swift]多线程--GCD

    1. 前言 之前写了一遍文章介绍了Objective-C中GCD的用法: [iOS]多线程--GCD, 现在转战到...

  • iOS多线程之GCD用法详解

    在上一篇讲解了iOS开发的三种多线程实现方式的特点和用法,在这一篇主要讲解一下GCD的用法。 GCD(Grand ...

  • 关于GCD常用的方法

    iOS开发多线程篇—GCD的常见用法 一、延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)...

  • iOS gcd看我就够了

    gcd是iOS中多线程的一种技术,下面我们来看看gcd的用法 同步&异步 同步 同步执行:字面意思,同步执行就是执...

  • iOS - GCD 用法详解

    以前总是被并行、串行,同步、异步 队列搞得晕头转向,最近理顺了一遍GCD的用法,再也不迷路了。一、Dispatch...

网友评论

      本文标题:iOS GCD扩展用法

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