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 任務完成