GCD全解-dispatch_after/dispatch_time-t延迟操作

简介: GCD全解-dispatch_after/dispatch_time-t延迟操作

1、延后执行:dispatch_after

延时操作的API,通常Queue会在主线程,但是也可以自定义线程


/**
 * @functoin 延迟操作
 * @param when:延时时间 dispatch_time() or dispatch_walltime().
 * @param queue :线程位置
 * @param block :执行事件
*/
void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block);


2、延长时间:dispatch_time_t

/**
 * @functoin 延长到的时间点
 * @param when:标识某个时间点,作为第二个参数的参照时间.
 * 1、如果传递了DISPATCH_TIME_NOW,那么dispatch_time()将使用默认时钟(在苹果平台上基于mach_absolute_time())。
 * 2、如果使用了DISPATCH_WALLTIME_NOW,则dispatch_time()将使用gettimeofday(3)返回的值。其中dispatch_time(DISPATCH_WALLTIME_NOW, delta)等价于dispatch_walltime(NULL, delta)。
 * 
 * @param delta :表示相对第一个时间点加上的纳秒数
*/
dispatch_time_t
dispatch_time(dispatch_time_t when, int64_t delta);
/// 系统提供了一些宏来简化时间
#define NSEC_PER_SEC 1000000000ull     多少纳秒 = 1秒            1秒 = 10亿纳秒              
#define NSEC_PER_MSEC 1000000ull       多少纳秒 = 1毫秒          1毫秒 = 100万纳秒
#define USEC_PER_SEC 1000000ull        多少微秒 = 1秒            1秒 = 100万微秒   
#define NSEC_PER_USEC 1000ull          多少纳秒 = 1微秒           1微秒 = 1000 纳秒


注意点:


USEC_PER_SEC需要注意一下:

按照道理来讲,USEC_PER_SEC的单位应该是微秒,如果继续换算成纳秒,还需要再乘以10^3才对。但是既然没有乘,大家在使用的时候就要注意,此宏虽表征微秒与秒的单位换算,但实际代表的时间是以纳秒来计算的。因此,但从计算来讲,只表示1毫秒。


3、拓展

单位定义:


SEC 秒

NSEC 纳秒

MSEC 毫秒

USEC 微秒

PER 每


单位转换:


秒单位的换算:

1s(秒)

=10^3ms(毫秒)

=10^6μs(微秒)

=10^9ns(纳秒)


在当前时间上延迟一秒,可以用如下方法获得时间点:


dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);
dispatch_time(DISPATCH_TIME_NOW, 1000 * USEC_PER_SEC);
dispatch_time(DISPATCH_TIME_NOW, USEC_PER_SEC * NSEC_PER_USEC);


应用示例:


dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
        (int64_t)(60 * NSEC_PER_SEC)),
     dispatch_get_main_queue(), ^{
  // 主线程执行代码
  NSLog(@"执行:main_queue -- 60");
});
NSLog(@"执行 -- before");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC), dispatch_queue_create("zm", NULL), ^{
       NSLog(@"执行:queue_create -- 3");
});
// 这里都是一样的,只不过调用的线程种类不一样
2016-11-05 17:10:43.921 Multithreading[16258:488248] 执行 -- before
2016-11-05 17:10:47.217 Multithreading[16258:488289] 执行:queue_create -- 3
2016-11-05 17:11:44.211 Multithreading[16258:488289] 执行:main_queue -- 60
相关文章
|
算法 JavaScript 大数据
高德地图 错误码说明 对照表
序号  infocode info返回值 状态描述 问题排查策略 1 10000 OK 请求正常 请求正常 2 10001 INVALID_USER_KEY key不正确或过期 开发者发起请求时,传入的key不正确或者过期  3 10002 SERVICE_NOT_AVAILABLE 没有权限使用相应的服务或者请求接口的路径拼写错误 1.开发者没有权限使用相应的服务,例如:开发者申请了WEB定位功能的key,却使用该key访问逆地理编码功能时,就会返回该错误。反之亦然。2.开发者请求接口的路径拼写错误。例如:正确的https://restapi.amap.com/v3/ip在程序中被拼装写了h
3406 0
|
移动开发 JavaScript 前端开发
【Uniapp 专栏】Uniapp 与 Flutter 的功能特点对比
【5月更文挑战第15天】Uniapp 和 Flutter 是跨平台开发的热门框架。Uniapp 以其强大的跨平台兼容性和基于 Vue.js 的易学性著称,适合快速开发适用于 iOS、Android 和 H5 的应用。其丰富的组件生态简化了功能集成。然而,在复杂场景下,性能可能不及原生。Flutter 则以其全新渲染引擎实现流畅界面和高度自定义,性能接近原生,但学习成本较高,需处理特定平台适配。适用于高要求的项目。两者各有优势,选择应考虑项目需求、技术储备和开发周期。
1692 1
【Uniapp 专栏】Uniapp 与 Flutter 的功能特点对比
|
移动开发 网络协议 前端开发
每日一博 - Server-Sent Events推送技术
每日一博 - Server-Sent Events推送技术
560 0
|
存储 Swift
大师学SwiftUI第18章Part3 - 自定义视频播放器
录制和播放视频对用户来说和拍照、显示图片一样重要。和图片一样,Apple框架中内置了播放视频和创建自定义播放器的工具。
617 0
|
前端开发 JavaScript Android开发
React Native跨平台开发实战
【7月更文挑战第21天】React Native为跨平台移动应用开发提供了一种高效且强大的解决方案。通过本文的学习,你应该能够掌握React Native的基本概念和实战步骤,并开始在你的项目中使用React Native进行开发。随着你对React Native的深入理解,你将能够利用其强大的功能来构建更加复杂和高效的移动应用。
|
存储 缓存 算法
RAM与ROM的区别及应用
RAM与ROM的区别及应用
MBProgressHUD和SVProgressHUD各自的缺点及解决方案
MBProgressHUD和SVProgressHUD各自的缺点及解决方案
279 0
|
小程序
大转盘抽奖小程序源码
大转盘抽奖小程序源码,测试依旧可用,无BUG,跑马灯旋转效果,非常酷炫。
464 1
|
iOS开发
如何识别手机是否有灵动岛(dynamic island)
如何识别手机是否有灵动岛(dynamic island)
711 0
|
存储 机器学习/深度学习 缓存
【C++】deque的实现原理简单介绍
【C++】deque的实现原理简单介绍
下一篇
oss云网关配置