Swift 中的 delay/sleep 无效
delay/sleep in Swift is not working
我对 Swift 代码中的 sleep
函数有疑问。我正在使用 import Darwin
和 usleep(400000)
。进入睡眠状态之前的某些操作被阻止,我不知道为什么。这是我的代码中的一个简短示例:
@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
usleep()
function will block your UI. If you don't want to have this behavior better use the Timer
class.
就像@jcaron 说的
这里是执行此操作的代码:
func delay(delayTime: Double, completionHandler handler:@escaping () -> ()) {
let newDelay = DispatchTime.now() + delayTime
DispatchQueue.main.asyncAfter(deadline: newDelay, execute: handler)
}
已编辑:您可以创建一个 viewController 扩展以在任何 viewController 中使用,如下所示:
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
})
其他人已经回答了这个问题,我只是想提供一些额外的信息(还不能发表评论)。
你说Antwort4.backgroundColor = UIColor.green
没有执行。澄清一下,这已执行,但您看不到结果,因为您调用了 sleep
,它阻塞了 UI。这是发生了什么:
- 将
Antwort4
的背景颜色设置为绿色
- 睡眠:阻止 UI 阻止应用实际显示绿色背景
- 再次将
Antwort4
的背景色设置为红色
要解决手头的问题,您可以使用苹果 Displatch API。因此,您可以使用:
而不是 sleept
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()
}
我对 Swift 代码中的 sleep
函数有疑问。我正在使用 import Darwin
和 usleep(400000)
。进入睡眠状态之前的某些操作被阻止,我不知道为什么。这是我的代码中的一个简短示例:
@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
usleep()
function will block your UI. If you don't want to have this behavior better use the Timer
class.
就像@jcaron 说的
这里是执行此操作的代码:
func delay(delayTime: Double, completionHandler handler:@escaping () -> ()) {
let newDelay = DispatchTime.now() + delayTime
DispatchQueue.main.asyncAfter(deadline: newDelay, execute: handler)
}
已编辑:您可以创建一个 viewController 扩展以在任何 viewController 中使用,如下所示:
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
})
其他人已经回答了这个问题,我只是想提供一些额外的信息(还不能发表评论)。
你说Antwort4.backgroundColor = UIColor.green
没有执行。澄清一下,这已执行,但您看不到结果,因为您调用了 sleep
,它阻塞了 UI。这是发生了什么:
- 将
Antwort4
的背景颜色设置为绿色 - 睡眠:阻止 UI 阻止应用实际显示绿色背景
- 再次将
Antwort4
的背景色设置为红色
要解决手头的问题,您可以使用苹果 Displatch API。因此,您可以使用:
而不是 sleeptDispatchQueue.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()
}