iOS 高性能定时器解决方案

最近在做一个电商项目,因为有很多界面有打折商品,打折商品会时间限制,所以里面用到了大量的定时器来算倒计时。每一个页面就是一个定时器。觉得太耗性能,想到了一个比较节约性能的方式。全局就一个定时器,控制全部的界面的倒计时。

项目用的是swift3.0

1、解决思路:

创建一个定时器的类,这个系统也就这一个定时器,定时器里面有一个代理方法,然后定时器执行的方法就是执行者个代理,那个需要用到定时器的界面,就去继承这个代理,然后实现代理的方法就行。

2、代码:

定时器类

import UIKit

protocol SSTTimerDelegate: class {

func updateTime()

}

final class SSTTimer: NSObject {

weak var delegate:SSTTimerDelegate?

static var shared: SSTTimer {

struct Static {

static let instance: SSTTimer = SSTTimer()

}

return Static.instance

}

private override init() {

super.init()

Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(didTimerAlarm), userInfo: nil, repeats:true)

}

func didTimerAlarm() {

self.delegate?.updateTime()

}

}

其他要用到定时器的类:

1、

class ViewController: UIViewController {

var i = 0

@IBOutlet weak var timeLabel: UILabel!

override func viewDidLoad() {

super.viewDidLoad()

}

override func viewWillAppear(_ animated: Bool) {

TimerUtil.shared.delegate = self

}

}

extension ViewController: TimerDelegate {

func updateTime() {

i = i + 1;

timeLabel.text = "\(i)"

}

}

2、

class ViewThreeVC: UIViewController {

var i = 0

@IBOutlet weak var timeLabel: UILabel!

override func viewDidLoad() {

super.viewDidLoad()

}

override func viewWillAppear(_ animated: Bool) {

TimerUtil.shared.delegate = self

}

}

extension ViewThreeVC: TimerDelegate {

func updateTime() {

i = i + 1;

timeLabel.text = "\(i)"

}

}

时间: 2025-01-12 23:53:21

iOS 高性能定时器解决方案的相关文章

高性能定时器时间轮的探究

时间轮的概念 关于定时器有很多种,有基于升序的定时器时间链表,但是这种链表存在效率的不足,就是当插入定时器的时候时间复杂度是O(n).今天,我们来认识一下高性能定时器时间轮. 如上图所示,就是一个时间轮的基本轮廓.一个轮子上有很多槽slot,每一个槽指向一个定时器链表,这个链表是无序的.时间轮每转动一步就会指向下一个槽,其实也可以理解为一个滴答时间成为时间轮的槽间隔si (slot interval).它实际上就是心跳时间.如果该时间轮有n个槽,因此它运转一周的时间是n*si. 如果现在指针指向

支持WEB、Android、IOS的地图解决方案

转自原文 支持WEB.Android.IOS的地图解决方案 工具链 GIS工具集 OpenGeo Suite 包含PostGIS, GeoServer, GeoWebCache, OpenLayers, 和 QGIS 地图准备 QGIS 导入.导出.编辑.shp,postgis,geotiff,geojson,dxf等多种GIS文件,给普通图片配准到地理坐标 教程:http://www.qgistutorials.com/en/ DraftSight 编辑CAD文件 SketchUp   从CA

iOS 时间校准解决方案

背景 在 iOS 开发中,凡是用到系统时间的,都要考虑一个问题:对时.有些业务是无需对时,或可以以用户时间为准的,比如动画用到的时间.一些日程类应用等.但电商相关的业务大都不能直接使用设备上的时间,而是需要跟服务器校准后的时间,例如: 区间判断:一些优惠促销活动需要在 app 端判断当前是否在活动期间内.如果用户设备时间不准,会给用户错误的信息,导致投诉. 倒计时:各种秒杀.限时促销.未支付订单的失效等的倒计时.如果用户设备时间不准,会带来倒计时结束后刷新页面,状态没变化的问题.可以测试一下电商

【转】IOS NSTimer 定时器用法总结

原文网址:http://my.oschina.net/u/2340880/blog/398598 NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; -

iOS "Xcode process launch failed: Security" in iPhone 6, iOS 8 -解决方案

问题重述: 在iOS 8中第一次运行App,Xcode出现弹出框:"Xcode process launch failed: Security" 解决方案: "If you get this, the app has installed on your device. You have to tap the icon. It will ask you if you really want to run it. Say "yes" and then Buil

iOS常用定时器

UIScrollView 拖动时执行的是 UITrackingRunLoopMode,会导致暂停定时器,等恢复为 NSDefaultRunLoopMode 时才恢复定时器.所以如果需要定时器在 UIScrollView 拖动时也不影响的话,建议添加到 UITrackingRunLoopMode 或 NSRunLoopCommonModes 中: NSTimer *timer = [NSTimer timerWithTimeInterval:5 target:self selector:@sele

IOS NSTimer 定时器用法总结

NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一.初始化方法:有五种初始化方法,分别是 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; - (void)viewDidLoad {     [super viewDidLoad];    

iOS中定时器

转载自  http://www.cocoachina.com/ios/20150519/11857.html 在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. 然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资料,大概有三种方法:NSTimer.CADisplayLink.GCD.接下来我就一一介绍它们的用法. 一.NSTimer 1. 创建方法 NSTimer *timer = [NSTimer

页面底部input被弹出来的键盘遮挡(iOS系统)—附解决方案

项目上要做一个留言回复的框. 类似这种用一个div套在input外面, 点击按钮时, 这个div出现, 位于页面底部. 并且input获得焦点, 自动弹出系统键盘. 但是, 在开发的时候发现,在iOS系统中这个div总是被键盘遮住, 曾经使用了垫高div框的办法, 天真的以为能够使它往上挪, 但是发现没有用, 需要手动往上拉才能出来. 查了很久, 看网上很多人都死在了这个问题上. 比较靠谱的答案在知乎上找到的 原因是fixed定位加上bottom:0在ios里无效了, 有人建议是改为弹性布局,