【问题标题】:How to "validate" a NSTimer after invalidating it?无效后如何“验证” NSTimer?
【发布时间】:2012-02-13 07:34:36
【问题描述】:

所以基本上,我有这个计时器,当它收到一个按键事件时应该重复这个计时器,并在用户释放按键时失效。但是,即使在 NSRunLoop 中调用addTimer:forMode:,我也无法“验证”计时器。有谁知道为什么会这样以及我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: objective-c cocoa nstimer nsrunloop


    【解决方案1】:

    您不能使用无效的计时器。

    来自 Apple 文档:

    一旦安排在运行循环上,计时器就会在指定的时间触发 间隔,直到它失效。非重复计时器无效 自己开火后立即。但是,对于重复计时器,您 必须自己通过调用其 invalidate 来使计时器对象无效 方法。调用此方法请求从 当前运行循环;因此,您应该始终调用 invalidate 来自安装计时器的同一线程的方法。 使计时器无效会立即将其禁用,使其不再 影响运行循环。然后运行循环删除并释放 计时器,在 invalidate 方法返回之前或某个时间 稍后点。一旦失效,定时器对象就不能被重用。

    【讨论】:

    • 有趣的是,有 NSRunLoop addTimer 但没有 removeTimer 可以用来阻止计时器触发而不使其无效。一定是创建计时器比创建端口便宜,这样苹果就不会费心添加那个 api。
    【解决方案2】:

    一旦你使一个 NSTimer 失效,你不应该再使用它。

    相反,创建一个新的计时器实例,并使用该实例添加到 NSRunLoop 的 addTimer 方法。就我个人而言,我更喜欢调用 NSTimer 的 scheduleTimerWithTimeInterval,因为它可以一次性完成所有操作。

    来自 NSTimer docs:

    调用此方法请求从当前的定时器中删除 运行循环;因此,您应该始终调用 invalidate 方法 来自安装计时器的同一线程。无效 计时器立即将其禁用,使其不再影响运行 环形。然后运行循环删除并释放计时器,或者只是 在 invalidate 方法返回之前或稍后的某个时间点。一次 无效,定时器对象不能被重用。

    【讨论】:

    • 对,我不知道...谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多