内容简介:好久没更新文章了,在掘金第一次发文章,还是给自己立一个flag每周至少更新一篇文章,可能文章的质量还不是很如意,希望通过写文章来提高自己文笔,以及记录自己学习中的遇到的问题解决方案。在学习iOS过程中,想定大家对于定时器都不陌生,在日常开发中总会碰到需要计时器的功能,常见的定时器有NSTimer、GCD、CADisplayLink。网上也有很多的教程介绍三者的区别,今天主要讲的是GCD这种方式使用以及封装。总结:NSTimer和CADisplayLink易受影响,而GCD虽然代码多,但是可控性非常强。
好久没更新文章了,在掘金第一次发文章,还是给自己立一个flag每周至少更新一篇文章,可能文章的质量还不是很如意,希望通过写文章来提高自己文笔,以及记录自己学习中的遇到的问题解决方案。
在学习iOS过程中,想定大家对于定时器都不陌生,在日常开发中总会碰到需要计时器的功能,常见的定时器有NSTimer、GCD、CADisplayLink。网上也有很多的教程介绍三者的区别,今天主要讲的是GCD这种方式使用以及封装。
三者概括区别
| 优点 | 缺点 | |
|---|---|---|
| NSTimer | 使用简单 | 受Runloop影响会导致计时不精准 |
| CADisplayLink | 精度高 | CPU负载的时候会影响触发事件,且触发事件大于触发间隔会导致掉帧现象。 |
| GCD | 较精准 | 代码较多,基本不受其他影响 |
总结:NSTimer和CADisplayLink易受影响,而GCD虽然代码多,但是可控性非常强。
GCD
/** 获取一个全局的线程来运行计时器*/
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);
/** 设置计时器, 这里是每10毫秒执行一次*/
dispatch_source_set_timer(timer, dispatch_walltime(nil, 0), 10*NSEC_PER_MSEC, 0);
/** 设置计时器的里操作事件*/
dispatch_source_set_event_handler(timer, ^{
//do you want....
});
复制代码
开启、继续已暂停的定时器
dispatch_resume(timer); 复制代码
暂停定时器
/** 挂起的时候注意,多次暂停的操作会导致线程锁的现象,即多少次暂停, * 对应多少次的继续操作,即dispatch_suspend和dispatch_resume * 是成对出现的,计时器才会继续工作。 */ dispatch_suspend(timer); 复制代码
结束定时器
dispatch_source_cancel(timer); 复制代码
构思封装
写代码之前构思好功能模块以及会遇到的问题的解决方案、代码逻辑,再来下手写代码,会有事半功倍的效果。
- 必然包含开始、暂停、继续、停止、重置功能
- 时间计算过程中因浮点数计算会丢失精度,计算过程应采用NSDecimal
- 时间转换考虑到精度以及便利性,采用系统的时间转换方法,时区置为GMT
- 由于APP进入后台,若未开启后台任务的开关,计时器将会停止,再次进入APP又会继续,故采用监听app状态的方式记录APP进入后台与前台的时间戳,并与截止时间相比,是否继续计时还是结束计时并回调。
- 计时器返回的结果若采用字符串则还需处理,故使用了一个时间类来把结果返回,可以进行自定义操作
- 倒计时的结果返回和结束通知采用闭包形式
部分代码
/** app进入后台*/
- (void)appDidEnterBackground{
[self suspend];
NSDate *date = [[NSDate alloc] init];
NSDateFormatter *format = [[NSDateFormatter alloc] init];
format.dateFormat = @"yyyy-MM-dd HH:mm:ss:SSS";
self.appDidEnterBackgroundTime = [date timeIntervalSince1970];
}
/** app进入前台*/
- (void)appDidEnterForeground{
NSDate *date = [[NSDate alloc] init];
NSDateFormatter *format = [[NSDateFormatter alloc] init];
format.dateFormat = @"yyyy-MM-dd HH:mm:ss";
self.appDidEnterForegroundTime = [date timeIntervalSince1970];
[self reCalculateMinder];
}
复制代码
/** 不失精度加减乘除计算结果*/
- (NSDecimalNumber *)value: (NSTimeInterval)value
byOpration: (OMDecimalOprationType)byOpration
percision: (NSInteger)percision
withValue: (NSTimeInterval)withValue{
NSDecimalNumber *number = [self numberValueWithString: value];
NSDecimalNumber *withNumber = [self numberValueWithString: withValue];
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode: NSRoundPlain scale: percision raiseOnExactness: NO raiseOnOverflow: NO raiseOnUnderflow: NO raiseOnDivideByZero: YES];
switch (byOpration) {
case OMDecimalOprationTypeAdd:
return [number decimalNumberByAdding: withNumber withBehavior:handler];
break;
case OMDecimalOprationTypeSubtract:
return [number decimalNumberBySubtracting: withNumber withBehavior: handler];
break;
case OMDecimalOprationTypeDivide:
return [number decimalNumberByDividingBy: withNumber withBehavior: handler];
break;
case OMDecimalOprationTypeMultiple:
return [number decimalNumberByMultiplyingBy: withNumber withBehavior: handler];
break;
default:
break;
return nil;
}
复制代码
@property (nonatomic, strong) OMTimer *timer; 复制代码
self.timer = [[OMTimer alloc] init];
self.timer.timerInterval = 30;
self.timer.precision = 100;
self.timer.isAscend = NO;
self.timer.progressBlock = ^(OMTime *progress) {
NSLog(@"%@:%@:%@:%@", progress.hour, progress.minute, progress.second, progress.millisecond;
};self.timer.completion = ^{
NSLog(@"complete done!");
};
复制代码
Swift版本
最近喜欢上了OC,如有小伙伴需要Swift的版本的话可以留言或者私我,可以在写个Swift版本,:stuck_out_tongue_winking_eye:。
结语
使用简单,只需要把OMTimer.h和OMTimer.m拖入你的工程即可,满足大数的场景,可倒计时亦可增加计时,全部代码已在Github< github.com/oymuzi/OMKi… >上面,如对你有帮助,希望得到你的一颗小星星:sparkles:,谢谢。/ 如有疑问,直接留言或者发送邮件给我admin@mypup.cn
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 「译」JavaScript 计时器之旅
- 详解Go语言的计时器
- Go 语言计时器的使用详解
- ProtoPie进阶教程1-3:计时器
- 【原创教程】用PS制作简单拟物计时器
- 浏览器中实现JavaScript计时器的4种创新方式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Processing语言权威指南
Casey Reas、Ben Fry / 张静 / 电子工业出版社 / 2013-10-1 / 139.00
本书介绍了可视化艺术中的计算机编程概念,对开源编程语言Processing作了非常详尽的阐述。学生、艺术家、设计师、建筑师、研究者,以及任何想编程实现绘画、动画和互动的人都可以使用它。书中的大部分章节是短小的单元,介绍Processing的语法和基本概念(变量、函数、面向对象编程),涵盖与软件相关的图像处理、绘制,并且给出了大量简短的原型程序,配以相应的过程图像与注释。书中还有一些访谈文章,与动画......一起来看看 《Processing语言权威指南》 这本书的介绍吧!