资讯专栏INFORMATION COLUMN

Pauseable Timer 一个可暂停的计时器

UCloud / 2655人阅读

摘要:项目主页英文介绍是一个用写的可暂停的计时器。因此,经过一些失败的尝试,我创建了这个可以暂停的计时器,希望对你也有用。这个功能的原理受到总结包括计时器不准的解决的启发。这时,计时器已经错过了它预计的。

项目主页: PauseableTimer Github Repository
英文介绍: Pauseable Timer

PauseableTimer 是一个用 Swift 写的可暂停的计时器。

有时候我们需要暂停计时器,但是这个功能在 Timer(Swift3) 中并没有被实现。因此,经过一些失败的尝试,我创建了这个可以暂停的计时器,希望对你也有用。

如何使用

创建一个计时器 Timer

e.g.
let timer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: aSelector, userInfo: nil, repeats: true)

创建一个可暂停的计时器 PauseableTimer,并将之前创建的 Timer 作为参数传入

e.g.
let pauseableTimer = PauseableTimer(timer: timer)

暂停 然后 重新开始!

e.g.
pauseableTimer.pause()
pauseableTimer.resume()

注意

如果用于初始化 PauseableTimer 的 Timer 不是通过 scheduledTimer 方法初始化的或没有被加入到 RunLoop 中,那么你需要手动将它加入到 RunLoop 中。你可以这样做,RunLoop.current.add(timer, forMode: .commonModes)

如果你需要操作用于初始化 PauseableTimer 的 Timer 或者需要获取它的属性,请使用 PauseableTimer 的 timer 属性。就像这样,pauseableTimer.timer.firedate = Date()

invalidate() 方法是为便于手动让 timer 失效而创建的。

介绍

PauseableTimer 并没有重新实现 Swift 中的 Timer,而是将 Timer 作为一个属性然后在它的帮助下实现了 暂停 的功能。

这个功能的原理受到 NSTimer 总结1(包括计时器不准的解决) 的启发。

主要思想是 当你需要暂停的时候,将 Timer 的 firedate 设置为一个无法达到的日期(这样计时器会一直等待,感觉起来就像是暂停了 :D);当你需要重新开始的时候,将 firedate 设置回原来的时间(这样计时器就可以『照常』触发)

简单聪明!

你可能注意到了加了引号的『照常』。事实上,这个方法可能无法达到你的期望,因为

Firedate 过期了。

e.g.
现在的时间是 2017.01.04 10:25。
原本的 firedate 是 2017.01.04 10:30。
你现在暂停了这个计时器,并且在十分钟后(2017.01.04 10:35)重新开始。这时,计时器已经错过了它预计的 firedate(2017.01.04 10:30)。
然而,如果这个计时器已经在 RunLoop 当中的话,当你在 2017.01.04 10:35 将 firedate 设置回 2017.01.04 10:30 时,计时器会立即触发一次。

我们希望计时器继续等待剩下的等待时间。

e.g.
现在的时间是 2017.01.04 10:25:00。
计时器的 timeInterval 是 60 秒。现在计时器被加入到 RunLoop,它应该在 60 秒后触发,也就是在 2017.01.04 10:26:00。
然后你因为某种原因在 10 秒后暂停了它,也就是在 2017.01.04 10:25:10。你在 2017.01.04 10:25:50 的时候重新开始了计时器。
不过,你仍然希望它是在设置好后,等待 60 秒再触发,不管暂停的那段时间。所以它应该再等待 50 秒,然后在 2017.01.04 10:26:40 触发。

完美的解决方案应该是满足以上所述三种情况的(另一种情况是我们不在乎原始 firedate 是否过期)。不过,这个项目目前只解决了第二个情况,因为这是我在其他项目中所遇到的需要解决的问题。

未来我可能会继续这个小项目,然后将每一种情况的解决方案都完善起来。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16589.html

相关文章

  • [iOS]各种定时器--最全时器使用

    摘要:然而当系统休眠的时候,默认时钟是不走的,也就会导致计时器停止。以特定模式注册到后,每当屏幕显示内容刷新结束的时候,就会向指定的发送一次指定的消息,类对应的就会被调用一次。 说到定时器, 我们使用最多的就是NSTimer 和 GCD 了, 还有另外一个高级的定时器 CADisplayLink; 一. NSTimer NSTimer的初始化方法有以下几种:会自动启动, 并加入 MainRu...

    LancerComet 评论0 收藏0
  • NSTimer学习笔记

    摘要:是一个模式集合,当绑定一个事件源到这个模式集合的时候就相当于绑定到了集合内的每一个模式。下面三种是内部框架支持用来监控对象的回复的,很少能够用到。用于标明和相关的事件。用于跟踪触摸事件触发的模式例如上下滚动。 NSTimer是iOS最常用的定时器工具之一,在使用的时候常常会遇到各种各样的问题,最常见的是内存泄漏,通常我们使用NSTimer的一般流程是这样的 在ViewControll...

    The question 评论0 收藏0
  • 原生js实现游戏按钮

    摘要:游戏按钮原生实现游戏的开始暂停结束实现使用实现实现步骤获取元素开始事件停止事件暂停事件定时器效果演示代码按钮动画样式输入游戏总时长分钟倒计时秒开始暂停结束有加入一丢丢的动画代码获取元素总时长剩余时长点开始按钮时间戳 游戏按钮 原生js实现游戏的‘开始’‘暂停’‘结束’ 实现: 使用setInterval实现 js实现步骤: 获取元素 开始事件 停止事件 暂停事件 定时器 效果演示:...

    LeoHsiun 评论0 收藏0
  • DanmuManager 一个简单弹幕工具

    摘要:暂停继续弹幕你也可以使用来快捷切换暂停继续。中每一个都对应一条正在进入视图的弹幕,当计时器结束时,通过发通知将该弹幕所在的行的状态更改为。为了避免手动发射弹幕和自动发射队列中的弹幕出现冲突弹幕重叠,所有弹幕通过定时任务统一调度。 项目首页: DanmuManager Github Repository 使用方法 Usage DanmuManager 和 VideoDanmuManage...

    geekzhou 评论0 收藏0
  • 演示当定时器在页面最小化时无法执行

      我们讲述的是关于 ahooks 源码系列文章的第七篇,总结主要讲述下面几点:  巩固 React hooks 的理解。  学习如何抽象自定义 hooks。构建属于自己的 React hooks 工具库。  培养阅读学习源码的习惯,工具库是一个对源码阅读不错的选择。  注:本系列对 ahooks 的源码解析是基于v3.3.13。自己 folk 了一份源码,主要是对源码做了一些解读,可见详情。  ...

    3403771864 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<