【问题标题】:What is the "cleartimeout" equivalent for Swift?Swift 的“cleartimeout”等价物是什么?
【发布时间】:2014-11-07 18:45:25
【问题描述】:

我正在尝试在文本输入字段上设置超时,该超时仅在用户停止输入后一秒钟实现内部代码。因此,当用户键入时,我会不断调用 cleartimeout 并重新启动 setTimeout。

我最初是在查看 Objective C 中的 performSelector 函数,但看起来没有 Swift 等效函数。

然后我转向 Swift 中的 GCD 函数,寻找一种方法来执行它。

这是我想出的:

var delta: Int64 = 1 * Int64(NSEC_PER_SEC)
var time = dispatch_time(DISPATCH_TIME_NOW, delta)
dispatch_suspend(dispatch_get_main_queue())
dispatch_after(time, dispatch_get_main_queue(), {
    println("timeout")
});

dispatch_suspend 函数没有像我希望的那样工作。

也许调度函数在这里不合适?

【问题讨论】:

  • 这可能在开始时使用一些上下文,需要一些工作才能弄清楚你在问什么
  • @StormeHawke - 完成:)

标签: swift timeout settimeout cleartimeout


【解决方案1】:

您可以使用dispatch_after 而不是performSelector 之一。但我认为这些都不是你想要的。

如果您希望仅在空闲一秒钟后才调用代码块,那么我认为您想使用计时器(例如Timer 很好,或者您可以使用调度计时器)。最重要的是,每次您获得键盘交互时,请查看是否有未决计时器,如果有,则将其无效,然后安排新的计时器。

所以我可能倾向于在 Swift 3 中执行以下操作。例如,在 iOS 10 及更高版本中,您可以使用块再现:

weak var timer: Timer?

func resetTimer() {
    timer?.invalidate()
    timer = .scheduledTimer(withTimeInterval: 1.0, repeats: false) { [weak self] timer in
        // do whatever you want when idle after certain period of time
    }
}

或者,如果您需要支持没有基于块的计时器的早期 iOS 版本:

weak var timer: Timer?

func resetTimer() {
    timer?.invalidate()
    timer = .scheduledTimer(timeInterval: 1, target: self, selector: #selector(handleIdleEvent(_:)), userInfo: nil, repeats: false)
}

@objc func handleIdleEvent(_ timer: Timer) {
    // do whatever you want when idle after certain period of time
}

但是,如果您使用后一种方法,请认识到此Timer 对其target 保持强引用,因此您可能希望取消viewDidDisappear 中的计时器(但不是deinit)。这就是为什么我们更喜欢基于块的再现或 GCD 计时器。


顺便说一句,我不确定你 dispatch_suspend 的意图是什么,但不要暂停主队列。您永远不想做任何可能干扰主队列及时处理事件的事情(即永远不要阻塞/暂停主队列)。

【讨论】:

  • 谢谢。这完美无缺。谢谢你的提示。我在写的时候很担心。感谢您的澄清。
猜你喜欢
  • 2014-08-12
  • 2014-08-01
  • 1970-01-01
  • 2014-09-24
  • 2016-12-13
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多