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无关;
上一篇: SQLServer之修改标量值函数