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

本文详细介绍了GCD(Grand Central Dispatch)中的延后执行和时间转换,包括dispatch_after函数用于延时操作,dispatch_time_t用于指定延长时间点,以及相关的宏定义进行时间单位转换。通过示例代码展示了如何在不同线程中延迟执行任务,并强调了USEC_PER_SEC宏的实际含义。
摘要由CSDN通过智能技术生成

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     多少纳秒 = 11= 10亿纳秒              
#define NSEC_PER_MSEC 1000000ull       多少纳秒 = 1毫秒          1毫秒 = 100万纳秒
#define USEC_PER_SEC 1000000ull        多少微秒 = 11= 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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜子三百克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值