您的位置:首页 > 其它

GCD学习笔记(五):dispatch_after

2015-06-10 12:48 381 查看
http://itjoy.org/?p=558

有时候我们需要延迟执行某个动作,比如三秒后打印一句话,可以调用[self performSelector:nil withObject:nil afterDelay:3],来实现任务延迟,也可以使用dispatch_after来完成这个动作:

Objective-C

1234567891011121314//// int64_t delayInSeconds = 10.0; /* *@parameter 1,时间参照,从此刻开始计时 *@parameter 2,延时多久,此处为秒级,还有纳秒等。10ull * NSEC_PER_MSEC */ dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ NSLog(@"hello world!"); }); ///[self performSelector:nil withObject:nil afterDelay:10];
需要注意的是,使用dispatch_after实现延迟执行某动作,时间并不是很精确,实际上是过多久将Block追加到main Queue中,而不是执行该动作,如果此时main queue中的任务很多,没有执行完毕,那么新添加的这个动作就要继续推迟。Objective-C

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

////////////////////////////////////////////////////////////

NSLog(@"hello
world");

dispatch_async(dispatch_get_main_queue(),
^{

sleep(10);

NSLog(@"sleep
10s");

});

NSLog(@"hello
objective-c");

dispatch_time_t
delayTime
=
dispatch_time(DISPATCH_TIME_NOW,
5ull
*
NSEC_PER_SEC);

dispatch_after(delayTime,dispatch_get_main_queue(),^(void){

NSLog(@"after
5s , execute!");

});

NSLog(@"hello
kevin jin");

// 2013-08-12 14:02:53.220 GCD[3273:11303] hello world

// 2013-08-12 14:02:53.221 GCD[3273:11303] hello objective-c

// 2013-08-12 14:02:53.222 GCD[3273:11303] hello kevin jin

// 2013-08-12 14:03:03.229 GCD[3273:11303] sleep 10s

// 2013-08-12 14:03:03.230 GCD[3273:11303] after 5s , execute!

如果对时间的精确度没有高要求,只是为了推迟执行,那么使用dispatch_after还是很不错的。

dispatch_time_t类型的时间我们可以通过dispatch_time来创建,也可以通过dispatch_walltime来创建。前者创建的时间多以第一个参数为参照物,之后过多久执行任务。后者多用于创建绝对时间,如某年某月某日某时某分执行某任务,比如闹钟的设置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: