iOS开发中创建定时器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/79378106

应用场景:

1.轮播图(轮播图上的图片定时轮播)

2.跑秒按钮(点击获取验证码之后,按钮上的秒数进行倒计时) 创建定时器的方式:

1.利用NSTimer

2.利用GCD中的dispatch_source_t 代码:

利用NSTimer创建定时器的代码:

方式一:

  • (void)startTimer

{

self.timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];

// 添加到运行循环  NSRunLoopCommonModes:占位模式  主线程

[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];  // 如果不改变Mode模式在滑动屏幕的时候定时器就不起作用了

}

  • (void)updateTimer{ NSLog(@”%lu”, time); time ++; if (time > 10) { [self.timer invalidate]; }

} 方式二:

  • (void)starTimerInChildThread{ [NSThread detachNewThreadSelector:@selector(bannerStart) toTarget:self withObject:nil];

}

// 在子线程中定义定时器

  • (void)bannerStart{ NSLog(@”。。。”); self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode]; [[NSRunLoop currentRunLoop] run];

}

  • (void)updateTimer{ NSLog(@”%lu”, time); time ++; if (time > 10) { [self.timer invalidate]; }

} 注意:上面两种方式创建的定时器在用户与页面进行交互的时候定时器还是有效的。方式一是将NSTimer添加到了主线程的runloop中,但添加的是NSRunLoopCommonModes模式下,如果是添加在NSDefaultRunLoopMode模式下那么当用户与页面进行交互的时候,定时器失效。方式二是开辟了一个子线程,在子线程的runloop中添加了NSTimer,此时即使模式是NSDefaultRunLoopMode,在用户与页面进行交互的时候,定时器依然有效。

利用GCD创建定时器:

  • (void)go{ __block NSInteger time = 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), 1.0 * NSEC_PER_SEC, 0); dispatch_source_set_event_handler(_timer, ^{ if (time > 10) { dispatch_source_cancel(_timer); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"计时结束.."); }); }else{ dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"---%lu", time); }); time ++; } }); dispatch_resume(_timer);

} 注意:必须使用dispatch_source_cancel才能完整地执行。

demo地址:https://gitee.com/liangsenliangsen/timer

本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

win10 17025 触摸bug

This article is written in both English and Chinese. 本文使用中文和英文两个版本。 在 win10 的 1...

9210
来自专栏菩提树下的杨过

WPF:自动执行"机器人"程序若干注意事项

企业应用中,经常会遇到一些需要定时自动执行的程序来完成某些功能,比如:自动定时从第三方web service取回数据、定时对历史数据进行清理、定时向ftp上传业...

22380
来自专栏林德熙的博客

win10 uwp 改变鼠标 设置光标移动鼠标

经常在应用需要修改光标,显示点击、显示输入,但是有些元素不是系统的,那么如何设置鼠标? 本文主要:UWP 设置光标,UWP 移动鼠标

17810
来自专栏王大锤

IOS开发中滑动页面时NSTimer停止的问题

42890
来自专栏蜉蝣禅修之道

sencha touch结合phonegap开发android下的文件浏览器

18850
来自专栏hbbliyong

WPF中播放声音媒体文件

这段时间我们小组要给部门的Annual Meeting準备一个WPF的抽奖程序,为了增加程序的有趣性,我们在程序中需要播放背景音乐等。由於对之前从未使用过WPF...

49460
来自专栏韦弦的偶尔分享

Swift 统一导入三方库

此时在Swift中的宏定义那就只能找个文件直接let了,比如Const.swift之类的。

47920
来自专栏林德熙的博客

dotnet 从入门到放弃的 500 篇文章合集

博客包括 C#、WPF、UWP、dotnet core 、git 和 VisualStudio 和一些算法,所有博客使用 docx 保存

28920
来自专栏学海无涯

iOS开发之XLForm的使用

在iOS开发中,开发"表单"界面,字段稍微多一点的一般都用UITableView来做,而XLForm就是这样一个框架,它是创建动态表格视图最牛逼的iOS库, 用...

51080
来自专栏哈雷彗星撞地球

RunLoop总结:RunLoop的应用场景(五)阻止App崩溃一次

今天要介绍的RunLoop应用场景感觉很酷炫,我们可能不常用到,但是对于做Crash 收集的 SDK可能会用得比较频繁吧。相比关于RunLoop 可以让应用起死...

16020

扫码关注云+社区

领取腾讯云代金券