博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
GCD(一次性代码、栅栏函数、延迟执行、定时器)
阅读量:6224 次
发布时间:2019-06-21

本文共 2754 字,大约阅读时间需要 9 分钟。

hot3.png

GCD(一次性代码、栅栏函数、延迟执行、定时器)

 

一次性代码多用于单例

作用:程序运行过程中直到销毁只会执行一次`

- (void)once{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        NSLog(@"once");    });}

延迟执行

- (void)delay{       // 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.延迟执行的第三种方法    /**     第一个参数:DISPATCH_TIME_NOW 从现在开始计算事件     第二个参数:延迟的时间 GCD时间单位:那秒     第叁个参数:队列     */    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{        NSLog(@"GCD ----  %@",[NSThread currentThread]);    });}- (void)task{    NSLog(@"task ----  %@",[NSThread currentThread]);}

栅栏函数

作用:只有当栅栏函数执行完毕后才能执行后面的函数

需求:使用栅栏函数规定线程执行顺序

注意点:栅栏函数不能使用全局并发队列

再次强调:栅栏函数不能使用全局并发队列
再再次强调:栅栏函数不能使用全局并发队列

使用示例

- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event{ dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT); //1.异步函数 dispatch_async(queue, ^{ for (NSInteger i =0 ; i < 5 ; i++){ NSLog(@"download1 -- %zd -- %@",i,[NSThread currentThread]); } }); dispatch_async(queue, ^{ for (NSInteger i =0 ; i < 5 ; i++){ NSLog(@"download2 -- %zd -- %@",i,[NSThread currentThread]); } }); dispatch_barrier_async(queue, ^{ NSLog(@"+++++++++++++++"); }); dispatch_async(queue, ^{ for (NSInteger i =0 ; i < 5 ; i++){ NSLog(@"download3 -- %zd -- %@",i,[NSThread currentThread]); } }); dispatch_barrier_async(queue, ^{ NSLog(@"+++++++++++++++"); }); dispatch_async(queue, ^{ for (NSInteger i =0 ; i < 5 ; i++){ NSLog(@"download4 -- %zd -- %@",i,[NSThread currentThread]); } });}

输出结果:

700

GCD里面的定时器,绝对精准,不受Runloop影响

- (void)touchesBegan:(NSSet
*)touches withEvent:(UIEvent *)event{ // 1.创建GCD中的定时器 // 1.1 DISPATCH_SOURCE_TYPE_TIMER Source类型 表示定时器 // 1.2 描述信息:线程ID // 1.3 更详细的描述信息 // 1.4 队列,决定GCD定时器中的任务在哪个线程中执行 dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0)); // 2.设置定时器(起始时间|间隔时间|精准度) // 2.1 定时器对象 // 2.2 起始时间,DISPATCH_TIME_NOW 从现在开始计时 // 2.3 间隔时间 , 2.0 GCD中时间为纳秒 // 2.4 精准度 绝对精准 0 dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC); // 3.设置定时器执行任务 dispatch_source_set_event_handler(timer, ^{ NSLog(@"GCD --- %@",[NSThread currentThread]); }); // 4.启动执行 dispatch_resume(timer); self.timer = timer; // 启动程序,不执行的原因:是因为2秒后timer被释放}

转载于:https://my.oschina.net/fadoudou/blog/1798525

你可能感兴趣的文章
[MicroPython]TurniBit开发板DIY自动窗帘模拟系统
查看>>
由String类的Split方法所遇到的两个问题
查看>>
Python3.4 12306 2015年3月验证码识别
查看>>
从Handler.post(Runnable r)再一次梳理Android的消息机制(以及handler的内存泄露)
查看>>
windows查看端口占用
查看>>
Yii用ajax实现无刷新检索更新CListView数据
查看>>
JDBC的事务
查看>>
Io流的概述
查看>>
App 卸载记录
查看>>
JavaScript变量和作用域
查看>>
JS 对象机制深剖——new 运算符
查看>>
开源SIP服务器加密软件NethidPro升级
查看>>
大型网站技术架构(一)大型网站架构演化
查看>>
百度页面分享插件源代码
查看>>
《别做正常的傻瓜》的一些读书心得
查看>>
作业:实现简单的shell sed替换功能和修改haproxy配置文件
查看>>
spring配置多数据源问题
查看>>
Altium 拼板方法以及 注意的 地方
查看>>
团队编程项目作业3-模块测试过程
查看>>
UTF-8的CSV文件用Excel打开会出现乱码的解决方案
查看>>