因此,我在构建Bingo应用程序时遇到了困难,当应用程序进入后台时,我希望该应用程序停止计时器。我的代码看起来像这样
var timer = Timer()
func ViewDidLoad(){
// other stuff
timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(numberPicker), userInfo: nil, repeats: true)
}
在我读过的其他文章中,我看到人们建议将timer定义为弱变量。当我尝试使用此计时器时,我的应用程序崩溃了。
答案 0 :(得分:1)
现代的解决方案是DispatchSourceTimer
,可以将其暂停和恢复。
两个通知观察者还使用了基于现代 swifty 块的API,无需使用@objc
。
let timer = DispatchSource.makeTimerSource(queue: DispatchQueue.global())
override func viewDidLoad() {
super.viewDidLoad()
timer.schedule(deadline: .now() + .seconds(5), repeating: 5.0)
timer.setEventHandler {
print("Timer fired")
}
NotificationCenter.default.addObserver(forName: UIApplication.didEnterBackgroundNotification, object: nil, queue: .main) { [weak self] _ in
self?.timer.suspend()
}
NotificationCenter.default.addObserver(forName: UIApplication.didBecomeActiveNotification, object: nil, queue: .main) { [weak self] _ in
self?.timer.resume()
}
timer.activate()
}
答案 1 :(得分:0)
尝试一下。当应用程序从后台返回时,计时器也会重新启动。
A a;
std::auto_ptr<A> a_copy = a.clone();
答案 2 :(得分:0)
迅速5:
override func viewDidLoad() {
super.viewDidLoad()
let notificationCenter = NotificationCenter.default
notificationCenter.addObserver(self, selector: #selector(appMovedToBackground), name: UIApplication.willResignActiveNotification, object: nil)
}
@objc func appMovedToBackground() {
timer.invalidate()
}