GCD定时器

GCD定时器

by 伍雪颖

+ (GCDTimer *)repeatingTimer:(NSTimeInterval)seconds
                                      block:(void (^)(void))block {
  NSParameterAssert(seconds);
  NSParameterAssert(block);

  GCDTimer *timer = [[self alloc] init];
  timer.block = block;
  timer.source = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,
                                        0, 0,
                                        dispatch_get_main_queue());
  uint64_t nsec = (uint64_t)(seconds * NSEC_PER_SEC);
  dispatch_source_set_timer(timer.source,
                            dispatch_time(DISPATCH_TIME_NOW, nsec),
                            nsec, 0);
  dispatch_source_set_event_handler(timer.source, block);
  dispatch_resume(timer.source);
  return timer;
}

- (void)invalidate {
  if (self.source) {
    dispatch_source_cancel(self.source);
    self.source = nil;
  }
  self.block = nil;
}
__block int n=0;
    self.timer = [GCDTimer repeatingTimer:1 block:^{
        n++;
        NSLog(@"Hello");
        if (n == 3) {
            [self.timer invalidate];
        }
    }];

使用简单方便.

时间: 2024-08-27 05:15:00

GCD定时器的相关文章

IOS GCD定时器

提到定时器,NStimer肯定是我们最为熟悉的. 但是NStimer有着很大的缺点,并不准确. 通俗点说,就是它该做他的事了,但是由于其他事件的影响,Nstimer会放弃他应该做的. 而GCD定时器,是不会发生这种事情的. GCD严格按照规定好的规格去做事. 前面介绍RunLoop 的时候已经介绍了NSTimer. 这里就不在介绍了. 在这里着重介绍一下GCD定时器. 首先,我们知道NStimer是在RunLoop的基础上执行的,然而RunLoop是在GCD基础上实现的,所以说GCD可算是更加高

GCD dispatch_source基本使用,创建GCD定时器与NSTimer的区别

可以使用GCD创建定时器 创建定时器: dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); self.timer = timer; // 定时任务调度设置,4秒后启动,每个5秒运行 dispat

runloop 和 CFRunLoop - 定时器 - NSTimer 和 GCD定时器

1. 2. 1 #import "ViewController.h" 2 3 @interface ViewController () 4 @property (nonatomic, strong) dispatch_source_t timer; 5 @end 6 7 @implementation ViewController 8 9 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *

GCD 定时器操作

var seconds = 10 //倒计时时间 let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue); dispatch_source_set_timer(timer,dispatch_walltime(nil, 0),1 * NSEC_PER_SEC,

Swift3.0 GCD定时器的使用,实现倒计时,UIDatePicker的使用, 仿写一个活动倒计时的DEMO

直接看主要代码 //截止日期 let endDate = datePicker.date //开始日期 let startDate = Date() //时间间隔 let timeInterval:TimeInterval = endDate.timeIntervalSince(startDate) if timer == nil { //剩余时间 var timeout = timeInterval if timeout != 0 { //创建全局队列 let queue = Dispatch

更加精确的定时器:dispatch_source_t

在使用定时器时,我们经常使用NSTimer,但是由于NSTimer会受RunLoop影响,当RunLoop处理的任务很多时,就会导致NSTimer的精度降低,所以在一些对定时器精度要求很高的情况下,应该考虑采用GCD定时器,实现代码如下: // 队列(队列时用来确定该定时器存在哪个队列中) dispatch_queue_t queue = dispatch_get_main_queue(); // 创建GCD定时器 _timer = dispatch_source_create(DISPATCH

iOS中的三大定时器

iOS开发中定时器经常会用到,iOS中常用的定时器有三种,分别是NSTime,CADisplayLink和GCD. NSTimer 方式1 // 创建定时器 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES]; // 停止定时器 [timer invalidate]; 方式2 // 创建定时器 NSTime

GCD,大家都知道的回顾

GCD,自iOS4.0吧,比block还要早,他的用处主要是体现在线程方面,比如你有个比较麻烦的而且循环比较大的代码段什么,比如有个后台下载什么的,这都必须放在子线程里一个放在子线程里执行,为了不影响用户体验! 来说说几个很基本的东西方便了解: 串行 系统默认就有一个串行队列main_queue,也就是主线程所在的队列,因为是串行,所以可以认为通过这个回到主线程 自定义dispatch_queue_create([queueName cStringUsingEncoding:NSUTF8Stri

iOS定时器的使用

iOS开发中定时器经常会用到,iOS中常用的定时器有三种,分别是NSTime,CADisplayLink和GCD. NSTimer 方式1 // 创建定时器 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES]; // 停止定时器 [timer invalidate]; 方式2 // 创建定时器 NSTime