iOS GCD使用dispatch_after、dispatch
2019-03-05 本文已影响0人
没脑子的程序员
dispatch_after
我们经常会有需要一个方法或者处理需要延迟一段时间执行,dispatch_after
函数就是用来实现这种功能
NSLog(@"2秒后执行");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"等了2秒,开始执行任务");
sleep(1);
NSLog(@"任务执行完成");
});
打印结果如下
16:44:04.949 2秒后执行
16:44:06.950 等了2秒,开始执行任务
16:44:07.955 任务执行完成
dispatch_after
有三个参数,第一个参与用来指定时间,传入的是dispatch_time_t类型的值,通过dispatch_time和dispatch_walltime函数生成。第二个参数是任务添加的队列,第三个是任务的block。
dispatch_after
的功能是在指定的时间将任务加入到队列中,而不是在指定的时间执行,如果所在的队列上有耗时任务在执行,那么时间上可能出现误差。
NSLog(@"2秒后执行");
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"等了2秒,开始执行任务");
sleep(1);
NSLog(@"任务执行完成");
});
sleep(5);
打印结果
10:04:41.799 2秒后执行
10:04:46.825 等了2秒,开始执行任务
10:04:47.827 任务执行完成
dispatch_time
dispatch_time
需要传入两个参数,第一个参数是时间点,第二个参数是时间长度,函数的作用就是获取时间点经过时间长度之后的时间点。第一个参数我们经常使用的是DISPATCH_TIME_NOW,表示现在这个时间点。第二个参数表示的时间长度使用数组* NSEC_PER_SEC的方式获得。
- NSEC_PER_SEC 表示秒
- NSEC_PER_MSEC 表示毫秒
- NSEC_PER_USEC 表示微秒
dispatch_walltime
dispatch_walltime
函数的第一个参数需要一个struct timespec类型的值,第二个参数是以纳秒为单位的延迟时间。
//设置时间点为2秒后
NSTimeInterval iT = [[NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]] timeIntervalSince1970];
struct timespec time;
time.tv_sec = (NSInteger)iT;
//比时间点再晚10秒
dispatch_time_t timer = dispatch_walltime(&time, 10*NSEC_PER_SEC);
NSLog(@"12秒后开始任务");
dispatch_after(timer, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSLog(@"任务开始");
sleep(1);
NSLog(@"任务完成");
});
打印结果
11:05:40.685 12秒后开始任务
11:05:52.000 任务开始
11:05:53.003 任务完成