http://itjoy.org/?p=558
有时候我们需要延迟执行某个动作,比如三秒后打印一句话,可以调用[self performSelector:nil withObject:nil afterDelay:3],来实现任务延迟,也可以使用dispatch_after来完成这个动作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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中的任务很多,没有执行完毕,那么新添加的这个动作就要继续推迟。
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来创建。前者创建的时间多以第一个参数为参照物,之后过多久执行任务。后者多用于创建绝对时间,如某年某月某日某时某分执行某任务,比如闹钟的设置。