【问题标题】:Swift: How do I invalidate all running timers?斯威夫特:如何使所有正在运行的计时器无效?
【发布时间】:2018-08-23 21:29:21
【问题描述】:

我目前正在开展一个项目,希望其他第三方开发人员可以向 iOS 应用程序添加功能。因此,我不希望他们启动计时器并稍后在对象实例已被删除时执行某些操作。那么有没有一种方法可以使所有正在运行的计时器或某些正在运行的计时器无效而不参考它们。如果没有,是否有任何其他方式可以为开发人员启用计时器功能,但阻止他们在“区域”之外使用它们。我应该覆盖计时器还是有更好的建议?

非常感谢

【问题讨论】:

  • 你可能不需要担心它;清理他们的东西是其他开发人员的责任,如果他们没有使计时器无效,那么对象将不会被释放,因为计时器将持有强引用;您可能会遇到内存泄漏,但您不会获得对已删除对象的引用
  • 我会尝试通过 API 提供计时器功能,这样您就可以自己跟踪活动计时器并在删除对象时使它们失效。当然这不会妨碍开发人员自己创建计时器,但现在他们有了首选的选择

标签: ios iphone swift xcode


【解决方案1】:

您可以继承Timer 并拥有一个共享实例,其中存储了当前使用的所有计时器。当您需要计时器时,您必须使用此 CustomTimer 而不是 Timer

class CustomTimer: Timer {

    static var sharedTimers: [CustomTimer] = []

    static func invalidateAllTimers() {
        for timer in CustomTimer.sharedTimers {
            timer.invalidate()
        }
    }

    // Use appropriate initializer and super calls.
    init() {
        CustomTimer.sharedTimers.append(self)
    }

    deinit {
        CustomTimer.sharedTimers.removeAll { (timer) -> Bool in
            return timer === self
        }
    }
}

现在您可以使用invalidateAllTimers 方法使所有计时器无效。

CustomTimer.invalidateAllTimers()

【讨论】:

  • @vadian 这不是我在 init 中通过将 self 附加到数组中所做的吗?
  • 这只有在其他开发人员使用你的CustomTimer类时才有效;如果他们只是使用普通的Timer,那么就没有办法跟踪了。
  • @Paulw11,是的,这就是我的解决方案。使用自定义计时器。
  • @SirJoe 我在扩展Timer 时找不到访问默认初始化程序的方法。您可以在扩展中使用convenience intializer 并执行我在这里所做的相同操作。但话又说回来,您的开发人员需要使用特定的 convenience 初始化程序才能按预期工作。
  • 我想我要编写自己的计时器类并在 3rd 方开发代码中搜索 Timer 或 NSTimer 用法
猜你喜欢
  • 2017-07-22
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多