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

时间:2019-12-19 18:16:42

标签: swift timer background-process

因此,我在构建Bingo应用程序时遇到了困难,当应用程序进入后台时,我希望该应用程序停止计时器。我的代码看起来像这样

var timer = Timer()

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

在我读过的其他文章中,我看到人们建议将timer定义为弱变量。当我尝试使用此计时器时,我的应用程序崩溃了。

3 个答案:

答案 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()
    }
相关问题