【问题标题】:NSTimer Reliable AlternativesNSTimer 可靠的替代品
【发布时间】:2011-12-31 15:07:00
【问题描述】:

我有一个应用程序,它应该每 1 秒记录一次某些事情,我目前正在使用NSTimer,但是如果我的应用程序转换屏幕(或几乎其他任何东西,真的)它会减慢计时器的速度用于不准确的读数。

什么是可靠的替代品?我目前的代码如下:

timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES];

【问题讨论】:

    标签: iphone objective-c ios nstimer


    【解决方案1】:

    NSTimer 永远不能保证准时触发。但是您可以以比现在更可靠的方式使用 NSTimer。当您使用scheduledTimerWithTimeInterval 时,您会创建一个在运行循环中为NSDefaultRunLoopMode 安排的NSTimer。此模式在使用 UI 时暂停,因此当有用户交互时您的计时器不会触发。要避免这种暂停,请使用模式NSRunLoopCommonModes。为此,您必须自己安排计时器,如下所示:

    timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(update) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    

    【讨论】:

    • 好的,我现在就改一下。我是否以相同的方式使计时器无效[timer invalidate]
    • 以这种方式创建的计时器的交互方式相同。除了您必须手动添加它。当您调用 invalidate 时,它​​应该像以前一样自动从 runloop 中删除。
    【解决方案2】:

    你可以:

    • 将 NSTimer 放在不同的线程中(这样可能不受 UI 影响)
    • 减少间隔(例如 0.1 秒),并在您的日志记录功能中检查是否是“正确”的时间来记录您想要的内容。

    【讨论】:

    • NSTimer 不会创建自己的新线程...?只是问...我在某个地方读到过。
    • 我尝试通过调用 performSelectorInBackground 将计时器放在不同的线程中,但它在触发时不会调用选择器(我猜是因为它在不同的线程中)。
    • @Steve: NSTimer 不创建自己的线程。它在创建它的线程上运行。
    • 减少间隔是一个很好的解决方案。 NSTimerisn't a real-time mechanism.
    • 也可以试试 Grand Central Dispatch (GCD)。它也可以用来创建计时器。也许他们会更可靠。
    猜你喜欢
    • 1970-01-01
    • 2014-12-20
    • 2010-11-03
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多