NSTimer 可靠的替代品

Posted

技术标签:

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

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

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

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

【问题讨论】:

【参考方案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)。它也可以用来创建计时器。也许他们会更可靠。

以上是关于NSTimer 可靠的替代品的主要内容,如果未能解决你的问题,请参考以下文章

Android AlarmManager 的 iOS 替代品 [关闭]

将 Node.js+Socket.io 包装成 OSX 可执行文件的可靠方法? (或用作替代品的 C/C++/Objective-C 库)

Windows 上可靠的 File.renameTo() 替代方案?

bonecp 连接池的快速可靠替代方案

nodejs Yarn替代npm的包管理——快速安全可靠性高的依赖管理

Notepad++ 替代品开源了,好用 !!!