前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 定时任务

iOS 定时任务

作者头像
码客说
发布2019-10-22 14:34:37
1.7K0
发布2019-10-22 14:34:37
举报
文章被收录于专栏:码客码客

前言

相对于Android来说 iOS定时任务用起来还是比较好用的

具体来说有三种

  • GCD方式
  • NSTimer
  • CADisplayLink

一般都用前两种 做视图绘制 动画 视频等才用第三种

使用方式

GCD方式

延时执行一次

代码语言:javascript
复制
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    //执行事件
});

重复执行

代码语言:javascript
复制
NSTimeInterval period = 1.0; //设置时间间隔

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);
dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //每秒执行

dispatch_source_set_event_handler(_timer, ^{
    //在这里执行事件
});

dispatch_resume(_timer);

停止方式

代码语言:javascript
复制
dispatch_cancel(_timer);
_timer = nil;

NSTimer方式

创建方式

代码语言:javascript
复制
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats: YES];

或者

代码语言:javascript
复制
NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

两种方式是等效的 第一种会自动加入到MainRunloopNSDefaultRunLoopMode

停止方式(非循环的可以不掉用)

代码语言:javascript
复制
[timer invalidate];

CADisplayLink

创建方式

代码语言:javascript
复制
self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];    
[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

停止方式

代码语言:javascript
复制
[self.displayLink invalidate];  
self.displayLink = nil;

重要属性

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 使用方式
    • GCD方式
      • NSTimer方式
        • CADisplayLink
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档