如何保留 Timer 实例

How to preserve a Timer instance

我有一个视图控制器 (TimerVC),其中我 运行 一个计时器,我在标签中显示计时器的当前状态。

我的定时器功能:

func runTimer() {
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: (#selector(updateTimer)), userInfo: nil, repeats: true)
}

当 TimerVC 打开时用户点击导航栏上的 "Back" 按钮(第 1 步),当用户再次点击按钮显示 TimerVC 时(第 2 步),我可以在控制台中看到计时器仍在后台 运行ning,但其状态未在标签中更新。

我猜这是因为当用户按下"Back"按钮时TimerVC的当前实例被销毁,当用户再次打开TimerVC时,它创建了一个新的TimerVC实例,因此无法更新标签。

我不知道如何在用户点击导航栏中的后退按钮时保留我的 TimerVC 实例,并在用户触发到 TimerVC 的 segue 时恢复旧的 TimerVC 实例。

为了在第 2 步解决这个问题,我尝试返回导航堆栈而不是创建一个新的推送到 TimerVC 的转场,但是它没有用,可能是因为在中找不到旧的 TimerVC 视图控制器堆栈,因此无法恢复。这并不奇怪,它应该在点击后退按钮时被破坏了。

我应该怎么做才能解决这个问题?

在 TimerVC 之前的视图控制器中有一个 属性

 var timerVC = TimerVC()

需要显示的时候推一下

self.navigationController.pushViewController(self.timerVC, animated:true)

这样您将始终处理 TimerVC

的相同实例

这里的事情是 Timer.scheduledTimer 将创建一个单例实例,它不会被杀死,即使你 vc 被取消初始化。

您可能想要做的是在不同的 class 中创建计时器,例如 TimerManager 或其他。

这 class 将维护计时器的状态和其他此类信息。

现在当您打开您的 TimerVC 时,您将从您的 TimerManager class 检查是否有定时器 运行。

记得保留这个TimerManagersingleton。所以 TimerManager 的实例没有被取消初始化。

如果计时器是 运行,您从 TimerManager class 获取计时器值等,否则您在 TimerManager class 中创建一个新计时器。

这也将帮助您在工作完成后使计时器失效。如果你有不同的流程和很多 push/pops 视图控制器,然后你回到你的 TimerVC,你仍然可以访问这个值。