1、上一篇 iOS 高性能定时器解决方案有缺陷,上一篇用的是代理设计模式,当离开当前界面时,代理就失效了,所以定时器的代理事件就不再执行,导致出错。现在这篇进行了改进,用通知实现。
2、还是会有一个全局定时器
import UIKit
let NotifyUpdateTime = NSNotification.Name(rawValue:"notifyUpdateTime")
final class TimerUtil:NSObject {
static var shared:TimerUtil {
struct Static {
static let instance: TimerUtil =TimerUtil()
}
return Static.instance
}
private overrideinit() {
super.init()
let timer = Timer(timeInterval: 1.0, target:self, selector: #selector(didTimerAlarm), userInfo:nil, repeats: true)
RunLoop.main.add(timer, forMode:RunLoopMode.commonModes)
}
func didTimerAlarm() {
NotificationCenter.default.post(name:NotifyUpdateTime, object:nil, userInfo:nil)
}
}
controller 1
class ViewController:UIViewController {
var i =0
@IBOutletweak var label:UILabel!
overridefunc viewDidLoad() {
super.viewDidLoad()
}
overridefunc didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
overridefunc viewWillAppear(_ animated:Bool) {
//接受time通知
NotificationCenter.default.addObserver(self, selector:#selector(updateTime),
name:NotifyUpdateTime, object: nil)
}
func updateTime() {
i =i + 1;
label.text ="\(i)"
}
}
ccontroller 2
class ViewTwoVC:UIViewController {
var i =0
@IBOutletweak var timeLabel:UILabel!
overridefunc viewDidLoad() {
super.viewDidLoad()
}
overridefunc viewWillAppear(_ animated:Bool) {
//接受time通知
NotificationCenter.default.addObserver(self, selector:#selector(updateTime),
name:NotifyUpdateTime, object: nil)
}
func updateTime() {
i =i + 1;
timeLabel.text ="\(i)"
}
}