当应用程序进入后台时如何暂停 Timer()

Jos*_*nti 2 timer background-process swift

所以我陷入困境,我正在构建一个宾果应用程序,我希望应用程序在应用程序进入后台时停止计时器。我的代码看起来像这样

var timer = Timer()

func ViewDidLoad(){
    // other stuff
    timer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(numberPicker), userInfo: nil, repeats: true)
}
Run Code Online (Sandbox Code Playgroud)

在我读过的其他帖子中,我看到人们建议将计时器定义为弱变量。当我尝试这个时,我的应用程序在尝试设置计时器时崩溃了。

vad*_*ian 5

现代解决方案是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()
}
Run Code Online (Sandbox Code Playgroud)