iOS中的定时器

2018-01-07  本文已影响0人  骑着雅迪小毛驴上班的老瞿

打算将定时器这种东西做一个全部的总结,一直没有去弄,在这里做一次全部的整理;希望在以后的工作中可以用到
1.GCD中使用定时器

 // 这里的队列是全局队列,全局队列的话系统给我们开启了一个新的全局线程,所以,在这里定时器不是在UI线程里面进行的,所以不会阻塞掉主线程的
 self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
        dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
        dispatch_source_set_event_handler(self.timer, ^{
            NSLog(@"我是定时器2222");
        });
        //启动定时器(不调用这个方法定时器是不会启动的)
        dispatch_resume(self.timer); 

2.NSTimer

1> 使用target方法创建定时器
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(run) userInfo:nil repeats:YES];

2> 使用block创建的定时器
[NSTimer scheduledTimerWithTimeInterval:0.5 repeats:YES block:^(NSTimer * _Nonnull timer) {
        NSLog(@"---------");
    }];

// 这两个中创建定时器的时候吗,如果有UI滚动,比如scrollview的滚动的时候,定时器就会失效,最好的办法就是将其加入runloop里面就不会定时器失效
// 注意:runloop的mode应该设置为 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
// 定时器的销毁:[timer invalidate];
// 使用timer的话有时候我们需要在定时器启动的时候就调用到对应的需要执行的定时器的方法..如果是target的话,我们可以调用到对应的响应方法...可是如果我们是使用到的timer的block方法创建的话,,我们就没有办法,让定时器一走完,立马就开始运行,,所以我们关于NSTimer的使用的时候,如果需要立马开始定时器,,我们可以调用
[timer fire];// 这个方法
  1. CADisplayLink(这个用的不是很多,一般和屏幕刷新类似的有关系,类似于NSTimer定时器)
CADisplayLink

    // 创建displayLink

    CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(test:)];

    // 将创建的displaylink添加到runloop中,否则定时器不会执行

    [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];



    // 停止定时器

    [displayLink invalidate];

    displayLink = nil;

当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了;执行invalidate操作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法

调用时机

CADisplayLink是一个和屏幕刷新率同步的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息,CADisplayLink类对应的selector就会被调用一次,所以可以使用CADisplayLink做一些和屏幕操作相关的操作。

重要属性

frameInterval
NSInteger类型的值,用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。
duration
readOnly的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间 = duration × frameInterval。

总结:定时器这东西反正是挺消耗性能的.性能最高的我们一般使用的上的还是GCD这种.推荐使用

上一篇 下一篇

猜你喜欢

热点阅读