想在指定时间后执行处理的情况,可以用dispatch_after函数实现。
我们写一段在3秒后将指定的block追加到Main Dispatch Queue的代码:
dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(), ^{
NSLog(@"3 seconds");
});
注意:dispatch_after 函数并不是在指定的时间后执行处理,而只是在指定时间追加处理到派发队列,此源代码与在3秒后用
dispatch_async函数追加Block到Main Dispatch Queue相同。
因为 Main Dispatch Queue 在主线程的RunLoop中执行,所以:
在比如每隔1/60执行的RunLoop中:
block最快在3秒后执行
最慢在3秒+1/60秒 后执行
在主派发队列有大量追加或主线程本身与延迟时,这个时间会更长。
在严格的时间要求下,使用会出现问题,但是想大致延迟执行处理时,该函数是非常有效的。
我们看一下dispatch_after函数的调用:
dispatch_after(time, dispatch_get_main_queue(), ^{
NSLog(@"3 seconds");
});
第一个参数:dispatch_time_t类型,用于指定时间,也可以使用dispatch_walltime
第二个参数:指定要追加处理的派发队列
第三个参数:指定记述要执行处理Block
我们再看一下dispatch_time函数,该函数能够获取从第一个参数dispatch_time_t类型值中指定的时间开始,到第二个参数指定的毫微秒单位时间后的时间。
第一个参数经常使用的值是:DISPATCH_TIME_NOW,这表示现在的时间。
第二个参数指定的毫微秒时间后的时间:写法如下图所示
dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_SEC);
数值和NSEC_PER_SEC的乘积得到单位为毫微秒的数值,“ull”是C语言的数值字面量,是显式表明类型时使用的字符串(表示“unsigned long long”)
如果使用NSEC_PER_SEC,则可以以毫秒为单位计算。
注:
在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。
几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数、浮点数以及字符串;
而有很多也对布尔类型和字符类型的值也支持字面量表示;还有一些甚至对枚举类型的元素以及像数组、
记录和对象等复合类型的值也支持字面量表示法。
字面常量(literal constant) 所谓字面,就是我们在程序中直接以值的行式来操作、表现(可以对照变量); 所谓常量,是指这些值不能再被改变了。 字面常量的种类: (1)整形 整形数值 默认是int型,例如:22,33 如果要表示一个long型,则加 l、L后缀。例如:22L、33L(可参考:https://www.cnblogs.com/zhanggaofeng/p/8168614.html)
dispatch_walltime:
这个函数由POSIX使用的 struct timespec类型的时间得到dispatch_time_t类型的值。
dispatch_time函数通常用于计算相对时间,而dispatch_walltime通常用于计算绝对时间。
注:dispatch_walltime这个命名也很贴切,墙上的时间,可以理解成挂在墙上的钟表显示的时间。
绝对和相对,串行和并行,类似的概念在计算机中有很多,作为人造学科,很多东西都是对生活中的模拟
因此,当一个东西有两种形态的时候,我们可以往绝对和相对,串行和并行这两个角度考虑。