【发布时间】:2017-03-16 13:17:37
【问题描述】:
我需要创建计时器,它将继续在后台状态下运行,并在应用程序进入前台状态后更新 UI。 最恰当的例子是 QuizClash 应用程序:
我有以下两个想法:
-
beginbackgroundTaskWithExpirationHandler
- 创建第一个计时器(30 秒间隔,不可重复)
- 创建第二个计时器(0.01 秒间隔,可重复)
- 第一个计时器将触发 [self timeExiped] 方法,该方法将显示一些 UI 更新
- 第二个计时器将触发上图中 ProgressBar 的更新
- 将其全部包装在 beginbackgroundTaskWithExpirationHandler 方法中
疑问:如果主计时器在后台状态下过期,UI 更新将不会显示(?)
-
状态恢复
- 启动相同的计时器
- 使用 encodeRestorableStateWithCoder:以保存当前时间戳,当进入后台时
- 使用 decodeRestorableStateWithCoder:获取保存的时间戳和现在之间的差异。
- 主定时器无效
- 使用 (remains_seconds - time_difference_seconds) 启动新的主计时器
疑问:这是否是一个可行的选择,因为我没有经验,暂时无法尝试?
如果您有任何其他想法,或者可以在上述 2 中指出我,我会放啤酒,如果您曾经在莫斯科 :)
【问题讨论】:
-
当您的应用处于后台时,您无法进行 UI 操作。如果我没记错的话,后台任务对您不起作用,因为它有大约 30 秒的时间限制。对于这项任务,状态恢复似乎过于复杂。您为什么不保留应用程序进入后台的时间,并计算当应用程序再次进入前台时您的应用程序在后台花费了多长时间。您可以简单地将
timeWhenAppGoesBackground写入NSUserDefaults -
我不需要在后台更新 UI,因为它没有意义。但是是的,NSUserDefaults 可以作为存储时间戳的一个选项,谢谢。
标签: ios objective-c timer