Swift 中的延迟/睡眠不起作用
Posted
技术标签:
【中文标题】Swift 中的延迟/睡眠不起作用【英文标题】:delay/sleep in Swift is not working 【发布时间】:2017-07-16 15:33:56 【问题描述】:我对 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
【问题讨论】:
不要使用sleep
或变体。你阻塞了主线程什么都不做。使用dispatch_after
【参考方案1】:
usleep()
函数将阻止您的 UI。如果您不想让这种行为更好地使用Timer
类。
【讨论】:
【参考方案2】:就像@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
)
【讨论】:
非常感谢,但有一件事我不知道:P 我必须使用什么作为延迟中的第二个参数(2,?) 第二个参数是闭包,你用它来为延迟结束后调用它的人返回函数。你在这里返回执行:处理程序)。我已经更改了代码,因此您可以在任何 viewControllers 中使用而无需再次创建函数。【参考方案3】:其他人已经回答了这个问题,我只是想提供一些额外的信息(尚无法评论)。
你说Antwort4.backgroundColor = UIColor.green
没有被执行。澄清一下,这是执行的,但您看不到结果,因为您调用 sleep
,这会阻塞 UI。这是发生了什么:
-
将
Antwort4
的背景颜色设置为绿色
sleep:阻止应用程序实际显示绿色背景的 UI
再次将Antwort4
的背景色设置为红色
要解决手头的问题,您可以使用 Apples 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 中的延迟/睡眠不起作用的主要内容,如果未能解决你的问题,请参考以下文章