使用dispatch_after在一段时间后执行处理

想在指定时间后执行处理的情况,可以用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这个命名也很贴切,墙上的时间,可以理解成挂在墙上的钟表显示的时间。

绝对和相对,串行和并行,类似的概念在计算机中有很多,作为人造学科,很多东西都是对生活中的模拟

因此,当一个东西有两种形态的时候,我们可以往绝对和相对,串行和并行这两个角度考虑。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值