iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime相关的知识,希望对你有一定的参考价值。

参考技术A 我们经常会有需要一个方法或者处理需要延迟一段时间执行, dispatch_after 函数就是用来实现这种功能

打印结果如下

dispatch_after 有三个参数,第一个参与用来指定时间,传入的是dispatch_time_t类型的值,通过dispatch_time和dispatch_walltime函数生成。第二个参数是任务添加的队列,第三个是任务的block。

dispatch_after 的功能是在指定的时间将任务加入到队列中,而不是在指定的时间执行,如果所在的队列上有耗时任务在执行,那么时间上可能出现误差。

打印结果

dispatch_time 需要传入两个参数,第一个参数是时间点,第二个参数是时间长度,函数的作用就是获取时间点经过时间长度之后的时间点。第一个参数我们经常使用的是DISPATCH_TIME_NOW,表示现在这个时间点。第二个参数表示的时间长度使用数组* NSEC_PER_SEC的方式获得。

dispatch_walltime 函数的第一个参数需要一个struct timespec类型的值,第二个参数是以纳秒为单位的延迟时间。

打印结果

iOS - dispatch_after解说

dispatch_after 是来延迟执行的GCD方法,因为在主线程中我们不能用sleep来延迟方法的调用,所以用dispatch_after是最合适的

dispatch_after 能让我们添加进队列的任务延时执行,该函数并不是在指定时间后执行处理,而只是在指定时间追加处理到dispatch_queu

GCD是Grand Central Dispatch的缩写,是苹果对多核硬件上执行并发代码的一种支持。

它有以下优点:

  • GCD通过把计算密集型任务放于后台运行,以此提高APP的响应速度。
  • GCD提供了更简单的并发模型,它优于线程锁,并且帮助你避免并发bug。
  • GCD基于底层、高性能的优化常规类型的代码,例如单例。
//该方法的第一个参数是time,第二个参数是dispatch_queue,第三个参数是要执行的block。
//在主线程中延迟执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});

 

特别注意

上面这句dispatch_after的真正含义是在6秒后把任务添加进队列中,并不是表示在6秒后执行,大部分情况该函数能达到我们的预期,只有在对时间要求非常精准的情况下才可能会出现问题。

 

参数dispatch_time_t解析

dispatch_time_t有两种形式的构造方式,第一种相对时间:通过dispatch_time函数。第二种是绝对时间,通过dispatch_walltime函数来获取,其需要使用一个timespec的结构体来得到dispatch_time_t

dispatch_time(<#dispatch_time_t when#>, <#int64_t delta#>)

//DISPATCH_TIME_NOW表示现在,NSEC_PER_SEC表示的是秒数,它还提供了NSEC_PER_MSEC表示毫秒
dispatch_time_t time=dispatch_time(DISPATCH_TIME_NOW, 10*NSEC_PER_SEC);

dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>)

//要使用一个timespec的结构体
dispatch_walltime(<#const struct timespec * _Nullable when#>, <#int64_t delta#>)
dispatch_time_t time_w = dispatch_walltime(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);

NSLog(@"——————————————————————————");
    //在主线程中延迟执行
dispatch_after(time_w, dispatch_get_main_queue(), ^{
   NSLog(@"=======================");
});

 

解析dispatch_time和dispatch_walltime

dispatch_time stops running when your computer goes to sleep. dispatch_walltime continues running. So if you want to do an action in one hour minutes, but after 5 minutes your computer goes to sleep for 50 minutes, dispatch_walltime will execute an hour from now, 5 minutes after the computer wakes up. dispatch_time will execute after the computer is running for an hour, that is 55 minutes after it wakes up.


dispatch_time得到的时间长度是相对的,与设备running时间相关,即设备运行时才计时;而dispatch_walltime设定的时间段是绝对的,与设备是否running无关;

以上是关于iOS GCD使用dispatch_after、dispatch_time、dispatch_walltime的主要内容,如果未能解决你的问题,请参考以下文章

iOS - dispatch_after解说

GCD dispatch_after 调用导致 SIGBUS 信号

iOS 多线程:『GCD』详尽总结

GCD 延时执行

iOS开发多线程篇 08 —GCD的常见用法

GCD中如何延迟处理任务