北京 APP 开发公司转载之倒计时设计大家有可能都了解相关倒计时的设备,比如厨房闹钟。那么如何自己设计一个倒计时程序呢,下面有齿轮为您转载一篇来之 sindrilin 的小巢整理的一个倒计时方案。(如有侵权,请及时联系我们,我们会及时下线相关内容)计算机是不存在倒计时这个概念的,所有的倒计时设计来源于对定时器的运用:给予一个 deadline,以秒为时间间隔,在每次回调时刷新屏幕上的数字。倒计时的实现几乎没有门槛,无论 NSTimer 也好,GCD 也罢,甚至使用 CADisplayLink都能用来制作一个倒计时方案。但同样的,低门槛也意味着方案的上下限差也很大,本文打算谈谈如何设计一个倒计时方案为什么要写这篇文章事实上,倒计时和我目前开发的方向八竿子打不着,我也确实没有必要和想过写这么一套方案。只是这几天有朋友分享了别人设计的倒计时功能:采用一个全局十时管理对象针对每一个倒计时按钮分配计时器,计时器会生成一个 NSOperation 对象来执行回调,完成倒计时功能在抛开代码不谈的情况下,这套设计思路我也是存疑的。如果倒计时要使用operation,那就需要使用 queue 来完成任务。根据 queue 的串行并行属性,要考虑这两点:•如果 queue 是并行的,一个界面上存在多个倒计时按钮时,可能会新建线程来处理同一个 queue 的任务,这部分的开销并不是必需的•operation 需要投放到 queue 里面启动执行。假如每秒的回调包装成operation 处理,那么需要一个定时机制来投放这些 operation。如果是这么,为什么不直接使用定时器,而要用 operation 但在看完设计者的文章和代码之后,我发现对方根本没有考虑过上面的问题。他 operation 的任务思路很奇怪:在每一个 operation 里面,采用 while+sleep 的方式,每次回调后让线程睡眠一秒,直至倒十时结束一(void)main{do{callback(self.leftTime);[NSThreadsleepForTimeInterval:1];}while(一一self.leftTime>0);}这种实现有三个坑爹的地方:1. while 循环结束之前,内部的临时变量不会被释放,存在内存占用过大的风险2. 如果 queue 是串行属性,多个 operation 将无法保证回调时间的正确3. 不应该采用 sleep 方式计时,这很浪费线程的执行效率另外,应用进入后台时,所有的子线程会被停止执行任务,这个会导致了应用切换前后台后,倒计时剩余时间不准。对于这种情况一般也有三种方式来做时间校正:1. 保存一个倒计时 deadline,在进入 active 后重...