GCD定时器

代码如下:

 1 #import "ViewController.h"
 2 @interface ViewController ()
 3 /** 定时器(不用带*,因为dispatch_source_t本身是一个类) */
 4 @property (strong, nonatomic)dispatch_source_t timer;
 5 @end
 6 @implementation ViewController
 7 - (void)viewDidLoad {
 8     [super viewDidLoad];
 9 }
10 
11 int count = 0;
12 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
13 {
14     //获得队列
15     dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
16     //创建一个定时器(dispatch_source_t本质还是一个OC对象,需要用强引用)
17     self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
18     //设置定时器的各种属性(几时开始任务,每隔多久执行一次)
19     //GCD的时间参数是纳秒(1秒=10的9次方纳秒)
20     dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)3.0 * NSEC_PER_SEC); //表示三秒后开始执行
21     uint64_t interval = (uint64_t)(2.0 * NSEC_PER_SEC);//表示时间间隔2.0秒执行一次
22     dispatch_source_set_timer(self.timer, start, interval, 0);
23     //设置回调
24     dispatch_source_set_event_handler(self.timer, ^{
25         NSLog(@"------%@-----",[NSThread currentThread]);
26     });
27     count++;
28     if (count == 3) {
29         //当执行完3次之后停止(注意是强引用,所以设置为空)
30         dispatch_cancel(self.timer);
31         self.timer = nil;
32     }
33     //启动定时器
34     dispatch_resume(self.timer);
35 }
36 @end

 上面有一个明显的错误,只有把

1 count++;
2 if (count == 3) {
3   //当执行完3次之后停止(注意是强引用,所以设置为空)
4   dispatch_cancel(self.timer);
5   self.timer = nil;
6 }

放入到回调内(dispatch_source_set_event_handler方法中),到执行3次的之后才能停止。

因为如果放在外面,后面的代码只执行一次,count永远为0

放入回调中,定时器每执行一次都会调用一次dispatch_source_set_event_handler,让count递增一次,到了执行第三次后就会停止!!

注:

1、NSTimer不准可以用GCD的定时器,(精确到纳秒)

2、GCD定时器不受RunLoop中Mode的影响

posted @ 2016-06-16 10:24  hissia  阅读(552)  评论(5编辑  收藏  举报