如何从后台状态更新UI

时间:2019-05-21 13:43:45

标签: ios swift background-process

我正在尝试创建一个计时器应用。我有一个带有计时器的单例课程,该计时器每x分钟触发一次。使用自定义委托,我将数据传递给活动视图控制器,并更新标签中的值。如果数据是在计数为y时,我将执行推并在另一个视图控制器的标签中更新计数。

当应用程序处于前台时,我没有任何问题。如果应用程序处于后台状态,则计数器将继续运行,并且标签文本不会更新,也不会执行推送。我仍然在第一个视图控制器中。该如何解决?

2 个答案:

答案 0 :(得分:-1)

您需要将所有前台UI任务包装在这样的块中

DispatchQueue.main.async {
   // do your UI stuff here, like
   // label.text = "Main thread stuff"
}

将其放入您的计时器操作中。

答案 1 :(得分:-1)

就像我在您的评论部分中提到的那样。当应用处于后台状态时,您不应该不断更新UI,因为它毫无意义。当用户点按回您的应用程序时,您的视图控制器将调用函数viewDidAppear(animated)。在该功能中,您可以检查计时器条件,然后根据需要显示第二个视图控制器。我将在下面发布示例代码

class FirstViewController : UIViewController {
    var timerExpiration = false
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if timerExpiration {
            let vc = SecondViewController()
            present(vc, animated: true, completion: nil)
        }
    }
}

class SecondViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}