• 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的影响

  • 相关阅读:
    全面分析C#方法中的ref和out
    SQL注入漏洞全接触入门篇
    如何使用四个语句来提高 SQL Server 的伸缩性
    5种提高SQL性能的方法
    SQL注入漏洞全接触高级篇
    网络游戏程序员须知 收包与发包
    SQL注入攻击的原理及其防范措施
    SQL注入漏洞全接触进阶篇
    C#委托的故事
    转眼又快一年了,最近没赚钱,在学习FLASH as3编程
  • 原文地址:https://www.cnblogs.com/hissia/p/5590087.html
Copyright © 2020-2023  润新知