倒数计时器,继续在后台运行

时间:2017-03-16 13:17:38

标签: ios objective-c timer

我需要创建计时器,它将继续在后台状态下运行,并在应用程序进入前景状态后更新UI。 最合适的例子是QuizClash app:enter image description here

我有以下2个想法:

  1. beginbackgroundTaskWithExpirationHandler

    • 创建第一个计时器(30秒间隔,不可重复)
    • 创建第二个计时器(间隔0.01秒,可重复)
    • 第一个计时器将触发[self timeExiped]方法,该方法将显示一些UI更新
    • 第二个计时器将触发上面图片中ProgressBar的更新
    • 在beginbackgroundTaskWithExpirationHandler方法
    • 中包装所有内容

    怀疑:如果主计时器在后台状态下过期,UI更新将不会显示(?)

  2. 恢复状态

    • 启动相同的计时器
    • 使用编码可恢复状态和编码器:在输入背景时保存当前时间戳
    • 使用解码可恢复状态和编码器:在保存的时间戳和现在之间得到区别。
    • 使主计时器无效
    • 使用(remain_seconds - time_difference_seconds)
    • 启动新的主计时器

    怀疑:它是否是一个可行的选择,因为我没有经验,暂时不能尝试?

  3. 如果您有任何其他想法,或者可以在上述2中指出我,如果您曾在莫斯科,我会喝啤酒:)

2 个答案:

答案 0 :(得分:2)

计时器的用途是什么?

如果要触发UI更改,尝试让它“在后台运行”是没有意义的,因为没有要更新的UI。

使用任何方法,您几乎肯定会想要使用时间戳...当应用程序返回到前台时,获取自上次时间戳以来经过的时间,根据需要更新UI,并重新启动Timer for foreground活动/更新。

答案 1 :(得分:1)

UIApplicationDidBecomeActive的观察者添加到viewWillAppear中包含ProgressBar的ViewController:

NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationDidBecomeActive, object: nil, queue: nil, using: self.applicationBecameActive)

将它放在viewWillAppear中,因为applicationBecameActive函数只应在包含进度条的viewcontroller在应用程序再次激活时位于堆栈顶部时触发。

然后在applicationBecameActive方法中,确定ProgressBar的当前进度值应该是什么,相应地更新,然后重新启动ProgressBar进度。

func applicationBecameActive(notification: Notification){

    //determine where the ProgressBar should be

    //set the ProgressBar progress value

    //restart the ProgressBar progress value updating

}

不要忘记在viewWillDissappear上删除观察者:

NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)