zoukankan      html  css  js  c++  java
  • 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的影响

  • 相关阅读:
    怎样快速学会ZBrush 中的移动笔刷的运用
    ZBrush中如何才能快速完成脸部雕刻(下)
    ZBrush中如何才能快速完成脸部雕刻(上)
    ZBrush中的Clip剪切笔刷怎么快速运用
    ZBrush中必须记住的常用快捷键
    怎么在ZBrush中渲染漫画风格的插画
    怎么运用ZBrush中的Z球制作身体部分
    ZBrush中的笔刷该怎样制作
    如何在ZBrush中添加毛发
    App交互demo
  • 原文地址:https://www.cnblogs.com/hissia/p/5590087.html
Copyright © 2011-2022 走看看