Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是「;cleartimeout“;相当于Swift?_Swift_Timeout_Settimeout_Cleartimeout - Fatal编程技术网

什么是「;cleartimeout“;相当于Swift?

什么是「;cleartimeout“;相当于Swift?,swift,timeout,settimeout,cleartimeout,Swift,Timeout,Settimeout,Cleartimeout,我试图在一个文本输入字段上设置一个超时,该字段只在用户停止键入一秒钟后实现内部代码。因此,当用户输入时,我会不断调用cleartimeout并重新启动setTimeout 我最初是在研究目标C中的performSelector函数,但它似乎没有对应的Swift函数 然后我转到Swift中的GCD函数,寻找执行此函数的方法 以下是我的想法: var delta: Int64 = 1 * Int64(NSEC_PER_SEC) var time = dispatch_time(DISPATCH_TI

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

我最初是在研究目标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函数没有像我希望的那样工作


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

之后调度\u
性能选择:afterDelay:
的一个很好的替代方法,但我认为这两个函数都不是您想要的(因为一旦设置了它们,就无法停止它们)

如果您希望在代码块空闲一秒钟后才调用它,那么我认为您需要使用计时器(例如
NSTimer
可以,或者您可以使用dispatch 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.0, target: self, selector: #selector(handleIdleEvent(_:)), userInfo: nil, repeats: false)
}

func handleIdleEvent(_ timer: Timer) {
    // do whatever you want when idle after certain period of time
}
或者,在Swift 2中:

weak var timer: NSTimer?

func resetTimer() {
    timer?.invalidate()
    let nextTimer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "handleIdleEvent:", userInfo: nil, repeats: false)
    timer = nextTimer
}

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

顺便说一句,我不确定您的
dispatch\u suspend
意图是什么,但不要挂起主队列。您永远不想做任何可能会干扰主队列对事件的及时处理的事情(即,永远不要阻止/挂起主队列)。

这可能会在开始时使用一些上下文,需要一些工作才能弄清楚您在做什么asking@StormeHawke-完成:)谢谢。那很好用。谢谢你的提示。我写出来的时候很担心。谢谢你的澄清。