【问题标题】:applicationDidEnterBackground with integer iteration整数迭代的 applicationDidEnterBackground
【发布时间】:2010-10-27 08:37:42
【问题描述】:

我的问题很简单(我认为)。我有一个实现简单计时器的类(使用一些整数和NSTimer)。我想关闭我的应用程序(所以进入后台模式),但我希望我的计时器仍然继续计数。我该如何管理?

非常感谢!

【问题讨论】:

    标签: iphone objective-c cocoa multitasking


    【解决方案1】:

    保存启动计时器时的时间。类似于self.timerStartDate = [NSDate date];。每秒调用一次 NSTimer 并增加一个整数会给您带来非常不准确的结果。
    来自NSTimer Class Reference

    定时器不是实时机制;它仅在已添加计时器的运行循环模式之一正在运行并且能够检查计时器的触发时间是否已过时触发。由于典型的运行循环管理的各种输入源,计时器的时间间隔的有效分辨率被限制在 50-100 毫秒的数量级。如果计时器的触发时间发生在长时间调用期间或运行循环处于不监视计时器的模式下,则计时器不会触发,直到运行循环下次检查计时器。因此,计时器触发的实际时间可能是计划触发时间之后的很长一段时间。

    如果您使用保存 startTime 的方法,如果程序未运行,您的 Timer 甚至会“运行”


    编辑: 是的。使用计时器计时是错误的。
    我只是写了一个小测试用例。一个带有 12 行的简单表格视图的应用程序。两个计时器,一个每毫秒触发一次,另一个每 10 秒触发一次。
    在第一个计时器中,我将一个整数加 1,在第二个计时器中,我打印第一个计时器的结果以及自上次打印以来经过的时间,用 mach_absolute_time() 测量。
    看看差异,第一次测量还不错,但是如果我开始滚动那个简单的 UITableView,它在我强大的 Mac 上的模拟器中运行,你会得到很大的不同。

    2010-10-27 11:16:49.266 MutliTableTest[24726:207] Calculated: 9.988000000000
    2010-10-27 11:16:49.267 MutliTableTest[24726:207] Measured  : 10.000055888000
    2010-10-27 11:16:59.266 MutliTableTest[24726:207] Calculated: 9.986000000000
    2010-10-27 11:16:59.267 MutliTableTest[24726:207] Measured  : 9.999898500000
    2010-10-27 11:17:09.608 MutliTableTest[24726:207] Calculated: 8.091000000000
    2010-10-27 11:17:09.609 MutliTableTest[24726:207] Measured  : 10.341779530000
    2010-10-27 11:17:19.266 MutliTableTest[24726:207] Calculated: 1.966000000000
    2010-10-27 11:17:19.267 MutliTableTest[24726:207] Measured  : 9.658319274000
    2010-10-27 11:17:29.266 MutliTableTest[24726:207] Calculated: 9.991000000000
    2010-10-27 11:17:29.267 MutliTableTest[24726:207] Measured  : 9.999891531000
    

    所以不要使用 NSTimer,使用 NSDate 并使用 NSTimeInterval ti = [[NSDate date] timeIntervalSinceDate:self.startDate]; 之类的东西获取当前时间和 startTime 之间的差异

    但我想知道为什么每毫秒需要一个不同的时间戳

    【讨论】:

    • 所以对你来说,使用整数增量(毫秒、秒、分钟等)不是一个好主意。所以最好使用开始日期,然后每毫秒(使用 NSTimer)获取当前日期并进行减法。是这样吗?
    • 这是一个计时器,所以我想要和我的数字手表一样的系统。我制作了 NSTimeInterval ti = [[NSDate date] timeIntervalSinceDate:self.startDate] 但是如何在没有计时器的情况下每毫秒刷新一次?
    • 每毫秒是每秒1000次,也就是每秒1000帧。我怀疑这是可能的,但是您可以为此使用计时器,这就是计时器的用途。只是不要用定时器做任何实时的事情。每秒重绘 30 次应该绰绰有余。
    • 当我使用计时器时它崩溃了......你确定在这种应用程序中使用时间间隔是个好主意吗?
    • 不要忘记保留 NSDate,它是您的 startDate...如果您想要准确的时间测量,使用 timeIntervals 是唯一可以使用的方法。您可以使用 mach_absolute_time() 来测量时间,但如果它必须如此准确,我无论如何都不会使用 iPhone。你有没有测量过你的方法的准确性?比如让程序运行 30 分钟并使用真正的秒表作为对比?我对此表示怀疑。顺便说一句,每秒调用 1000 次计时器会使我的 ipad 上的 CPU 负载几乎达到 100%。
    猜你喜欢
    • 2015-12-11
    • 2023-03-14
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多