Swift中的延迟/睡眠不起作用
我在Swift代码中遇到sleep
函数的问题。我正在使用import Darwin
和usleep(400000)
。达到睡眠之前的一些行动被阻止,我不知道为什么。这里从我的代码很短的例子:Swift中的延迟/睡眠不起作用
@IBAction func Antwort4Button(_ sender: Any) {
if (richtigeAntwort == "4"){
Antwort4.backgroundColor = UIColor.green
Ende.text = "Richtig!"
NaechsteFrage()
}
else {
Ende.text = "Falsch!"
//NaechsteFrage()
}
}
func NaechsteFrage() {
usleep(400000)
Antwort1.backgroundColor = UIColor.red
Antwort2.backgroundColor = UIColor.red
Antwort3.backgroundColor = UIColor.red
Antwort4.backgroundColor = UIColor.red
Ende.text = ""
FragenSammlung()
}
此线将不会执行:
Antwort4.backgroundColor = UIColor.green
Ende.text = "Richtig!"
为什么调用sleep阻止这些行为?如果我删除import Darwin
和sleep
,我的代码工作正常。有没有人有想法?对不起,我的英文不好:P
其他alrady回答了这个问题,我只是想提供一些额外的信息(目前还不能评论)。
你说Antwort4.backgroundColor = UIColor.green
没有执行。为了澄清,这是执行的,但你看不到结果,因为你打电话sleep
,这是阻止用户界面。这是发生了什么:中Antwort4
- 设置背景颜色为绿色
- 睡眠:阻止,防止应用程序从实际显示绿色背景
- 再次 设置
Antwort4
背景色为红色的UI
要解决手头上的问题,您可以使用Apples Displatch API。因此,您可以使用:
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
self.Antwort1.backgroundColor = UIColor.red
self.Antwort2.backgroundColor = UIColor.red
self.Antwort3.backgroundColor = UIColor.red
self.Antwort4.backgroundColor = UIColor.red
self.Ende.text = ""
self.FragenSammlung()
}
像@jcaron说
这里的代码来做到这一点:
func delay(delayTime: Double, completionHandler handler:@escaping() ->()) {
let newDelay = DispatchTime.now() + delayTime
DispatchQueue.main.asyncAfter(deadline: newDelay, execute: handler)
}
编辑:您可以创建一个扩展的viewController任何viewControllers使用这样的:
extension UIViewController {
func delay(delayTime: Double, completionHandler handler:@escaping() ->()) {
let newDelay = DispatchTime.now() + delayTime
DispatchQueue.main.asyncAfter(deadline: newDelay, execute: handler)
}
}
所以在你的viewController中你可以这样调用:
delay(delayTime: 2, completionHandler: {
_ in
// do your code here
})
非常感谢,但有一件事我不知道:P我有什么作为第二个参数delay(2,?) –
第二个参数是闭包,您使用它返回延迟结束后调用它的那个函数。你在这里返回execute:handler)。我更改了代码,以便您可以在任何viewControllers中使用,而无需再次创建函数。 –
请勿使用“sleep”或变体。你阻止主线程无所事事。使用['dispatch_after'](https://developer.apple.com/reference/dispatch/1452876-dispatch_after) – jcaron