iOS 中几种常用的定时器

定时器是开发中常用一中工具,定时器常用的为NSTimer,CADisplayLink以及GCD定时器

  • NSTimer
    NSTimer也分为两种情况
    • 一个方法是自动加入当前线程的RunLoop中,并且运行模式为NSDefaultRunLoopMode模式,不需要手动开启,代码如下
      /*
      第一个参数:时间间隔
      第二个参数:方法的调用者
      第三个参数:执行的方法
      最后一个参数:是否需要重复
      */
      NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(demo1) userInfo:nil repeats:YES];
      注意:如果想要在有scrollView拖动的情况下定时器也能使用必须手动切换其运行模式到NSRunLoopCommonModes
      //切换到NSRunLoopCommonModes
      [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
    • 另外一种创建方式必须要手动把NSTimer对象加入到对应的RunLoop中,并且制定运行模式才可以运行,代码如下:
      /*
       第一个参数:时间间隔
       第二个参数:方法的调用者
       第三个参数:执行的方法
       最后一个参数:是否需要重复
       */
      NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(demo) userInfo:nil repeats:YES];
      [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
  • CADisplayLink
    这个定时器和NSTimer有很多相同之处,它也是依赖于RunLoop运行的,唯一的区别是,它的频率是60Hz,创建方式如下:

    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(demo)];
      [link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

    以下这幅图中可以看出CADisplayLink的执行频率
    CADisplayLink的调用频率图:


    Snip20160717_6.png


    NSTimer的调用频率图:


    Snip20160717_7.png
  • GCD定时器
    CGD定时器就和NSTimer以及CADisplayLink有很多不同之处了

    • 首先,CGD定时器是独立于RunLoop执行的
    • 其次,CGD定时器的最小时间间隔单位是纳秒(1秒=10的10次方纳秒)
    • 然后,CGD定时器的创建和使用是一套纯C语言库,用起来相对来讲麻烦一下
      话不多说直接上代码
      //创建
      dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0,queue);
      //这里必须有一个强指针指向,因为GCD定时器本质还是一个OC对象
      self.timer = timer;
      //设置定时器开始时间,这里的时间单位是纳秒
      dispatch_time_t startTime = dispatch_time(DISPATCH_TIME_NOW,2 * NSEC_PER_SEC);
      //设置定时器
      dispatch_source_set_timer(timer,startTimer,(int64_t)(2 * NSEC_PER_SEC),0);
      //设置定时器所做的事情,block回调
      dispatch_source_set_event_handler(timer,^{
      //定时器要做的事情
      });
      //CGD定时器默认是暂停的,需要手动开启
      dispatch_resume(timer);
      //定时器的关闭
      dipatch_cancel(self.timer);
      self.timer = nil

关于常用的定时器就介绍这么多,希望对大家有所帮助



文/落雪无痕_t(简书作者)
原文链接:http://www.jianshu.com/p/0194a0866872
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值