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