美文网首页
iOS-定时器

iOS-定时器

作者: Tation | 来源:发表于2017-01-22 17:52 被阅读0次

一.NSTimer

推荐亮点:

1.实用与图片轮播等频率不快的需求

相关操作:

1.暂停

[self.DD_Timer setFireDate:[NSDate distantFuture]];

2.继续执行

[self.DD_Timer setFireDate:[NSDate distantPast]];

3.关闭定时器

[self.DD_Timer invalidate];

self.DD_Timer = nil;

注意事项:

1.存在延迟可能性,精确时间在100ms左右

代码:

//实例化定时器

self.DD_Timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(TimerFouncation) userInfo:nil repeats:YES];

//更改RunLoop运行模式,防止UIScrollView滚动时RunLoop模式改变,

[[NSRunLoop currentRunLoop]addTimer:self.DD_Timer forMode:NSRunLoopCommonModes];

//子线程运行循环需要手动开启

[[NSRunLoop currentRunLoop] run];

二.CADisplayLink

推荐亮点:

1.主要用于界面重绘,适合视频播放时获取下一帧进行界面渲染

相关操作:

1.preferredFramesPerSecond  用来设置间隔多少帧调用一次selector方法,默认值是0

2.duration 表示两次屏幕刷新之间的时间间隔,该属性在target的selector被首次调用以后才会被赋值,调用间隔时间 = duration × preferredFramesPerSecond

3.暂停

 self.DD_DisplayLink.paused = YES;

4.再次启用

self.DD_DisplayLink.paused = NO;

4.停止

[self.DD_DisplayLink invalidate];

self.DD_DisplayLink = nil;

注意事项:

1.延迟原因:当调用方法耗时,或者CPU忙碌程度高时,当次方法执行时间超过屏幕刷新周期,会导致跳过若干次执行机会

代码:

//需要手动添加到运行循环中,不然不会执行

self.DD_DisplayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(TimerFouncation)];

[self.DD_DisplayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

三.GCD定时器:

推荐亮点:

1.相对于NSTimer它可以直接在后台执行而不需要在main_queue和后台queue之间切换

2.精确度高,可达纳秒级

3.不需要添加到运行循环中

4.相对于NSTimer它立即执行block中的代码,NStimer需要等到第一次计时器触发

相关操作:

1.启用(激活):dispatch_resume(<#dispatch_object_t  _Nonnull object#>)

2.暂停(挂起):dispatch_suspend(<#dispatch_object_t  _Nonnull object#>)

3.停止:dispatch_source_cancel(<#dispatch_source_t  _Nonnull source#>)

注意事项:

1.dispatch_suspend定时器后不能释放,赋值为nil会导致崩溃

2.无法检测当前定时器是否处于挂起状态

代码:

1.系统自带提示:dispatch_source timer GCD

//************注意:timer 需要作为属性强引用,不然会被释放掉*****************//

dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());

dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);

dispatch_source_set_event_handler(timer, ^{

[weakSelf TimerFouncation];

});

dispatch_resume(timer);

2.手动创建

//创建全局属性

@property (nonatomic, strong) dispatch_source_t DD_GCDTimer;

//block代码执行队列

dispatch_queue_t queue = dispatch_queue_create("queueName", DISPATCH_QUEUE_CONCURRENT);

self.DD_GCDTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

//定时器开启时间

dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC));

//执行间隔

uint64_t interval = (uint64_t)(0.1 * NSEC_PER_SEC);

dispatch_source_set_timer(self.DD_GCDTimer, start, interval, 0);

__weak ViewController *weakSelf = self;

// 设置回调

dispatch_source_set_event_handler(self.DD_GCDTimer, ^{

[weakSelf GCDTimerFouncation];

});

// 启动定时器

dispatch_resume(self.DD_GCDTimer);

参考资料:

http://www.tuicool.com/articles/JN36BnY

http://blog.csdn.net/springjustin/article/details/50978671

相关文章

  • iOS-定时器

    一.NSTimer 推荐亮点: 1.实用与图片轮播等频率不快的需求 相关操作: 1.暂停 [self.DD_Tim...

  • IOS-定时器

    一、NSTimer(存在延迟) 创建方法 TimerInterval : 执行之前等待的时间。比如设置成1.0,就...

  • iOS-定时器相关

    定时器相关文档内容. 1.一个play方法实现全屏炫酷倒计时的小demoiOS轮播图:CADisplayLink实...

  • iOS-定时器 NSTimer

    首先关闭定时器不能使用上面的方法,应该使用下面的方法: 然后就可以使用下面的方法再此开启这个timer了:

  • iOS-私有API与runtime

    iOS-私有API与runtime iOS-私有API与runtime

  • iOS-代码混淆加固策略

    iOS-代码混淆加固策略 iOS-代码混淆加固策略

  • iOS-性能优化深入探究

    iOS-性能优化深入探究 iOS-性能优化深入探究

  • iOS-自动打包及分发(三)

    iOS-自动打包及分发(一)iOS-自动打包及分发(二)iOS-自动打包及分发(三) 废话不多说了,上正文: 一、...

  • iOS-自动打包及分发(二)

    iOS-自动打包及分发(一)iOS-自动打包及分发(二)iOS-自动打包及分发(三) 本篇介绍:自动打包及分发xc...

  • iOS-定时器的创建

    定时器 NSTimer 1.创建方式: TimerIntval:执行之前等待的时间.比如设置成1.0 就代表1秒后...

网友评论

      本文标题:iOS-定时器

      本文链接:https://www.haomeiwen.com/subject/ireobttx.html