最近在做一個電商項目,因爲有很多界面有打折商品,打折商品會時間限制,所以裏面用到了大量的定時器來算倒計時。每一個頁面就是一個定時器。覺得太耗性能,想到了一個比較節約性能的方式。全局就一個定時器,控制全部的界面的倒計時。
項目用的是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)"
}
}