IOS开发入门之在iOS上如何触发定时任务或延时任务?
凌雪 2018-10-10 来源 :网络 阅读 1076 评论 0

摘要:本文将带你了解IOS开发入门在iOS上如何触发定时任务或延时任务?,希望本文对大家学IOS有所帮助。

本文将带你了解IOS开发入门在iOS上如何触发定时任务或延时任务?,希望本文对大家学IOS有所帮助。


       

iOS中如何触发定时任务或延时任务?


定时任务指的是周期性的调用某个方法,实现任务的反复执行,例如倒计时功能的实现;延时任务指的是等待一定时间后再执行某个任务,例如页面的延时跳转等。iOS中控制任务的延时或定时执行的方法有很多,使用中要注意是同步还是异步,是否会阻塞主线程等问题。实现方法主要如下:

1.performSelector实现延时任务

延时任务可以通过当前UIViewController的performSelector隐式创建子线程实现,不会阻塞主线程:

?


/* 延迟10s执行任务 */

[self performSelector:@selector(task) withObject:nil afterDelay:10];

-(void)task

{

      // delay task  

}


?2.利用sleep实现后面任务的等待,慎用,会阻塞主线程

NSThread sleepForTimeInterval:10.0];

通过GCD实现block代码块的延时执行:3.GCD实现延时或定时任务



dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW,   10   *   NSEC_PER_SEC);

dispatch_after(delay,   dispatch_get_main_queue(), ^{

      // delay   task

});


?GCD也可以用来定义计时器实现定时器功能,可以设置延时开启计时器,使用中要注意一定要定义强指针指向计时器对象才可让计时器生效:


/* 必须要用强指针指引计时器才会生效 */

@property (nonatomic, strong)dispatch_source_t   timer;

 

/* 在指定线程上定义计时器 */

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_time_t when = dispatch_time(DISPATCH_TIME_NOW,   (int64_t)(1.0   *   NSEC_PER_SEC));

/* 设置计时器   */

dispatch_source_set_timer(_timer, when, 1.0 * NSEC_PER_SEC, 0);

/*   计时器回调block */

dispatch_source_set_event_handler(_timer,   ^{

    NSLog(@"dispatch_source_set_timer is   working!");

});

/* 开启计时器   */

dispatch_resume(_timer);

/* 强引用计时器对象 */

self.timer = _timer;

5.CADisplayLink实现定时任务4.NSTimer实现定时任务

CADisplayLink实现的定时器与屏幕刷新频率绑定在一起,是一种帧率刷新,适用于界面的不断重绘(例如流畅动画和视频播放等)。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束就会向CADisplayLink指定的target发送一次消息,实现target的每帧调用。根据需求也可以设置每几帧调用一次,默认每帧都调用。另外通过CADisplayLink还可以获取帧率和时间等信息。

CADisplayLink实现方法的每帧调用使其计时精度非常高,但如果调用的方法十分耗时,超过一帧的时间间隔,会导致跳帧,跳帧次数取决于CPU的忙碌程度。



- (void)viewDidLoad {

    [super viewDidLoad];    

 

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

    /* 添加到当前运行的RunLoop中启动   */

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

    /* 暂停、继续对selector的调用   */

    //[displayLink   setPaused:YES];

    //[displayLink   setPaused:NO];

    /* 设置每几帧调用一次selector,默认为1   */

    //[displayLink   setPreferredFramesPerSecond:2];

    /* 移除,不再使用   */

    //[displayLink   invalidate];

    //displayLink =   nil;

}

 

-   (void)   displayLink_SEL{

    NSLog(@"displayLink is working!");

}

打印结果如下,每一帧都调用selector:


2018-02-01 11:48:02.707283+0800 IOSDemo[42328:4522489]   displayLink is working!

2018-02-01 11:48:02.724375+0800 IOSDemo[42328:4522489]   displayLink is working!

2018-02-01 11:48:02.742995+0800 IOSDemo[42328:4522489] displayLink is   working!



本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!    


本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程