从本质上讲,我正在开发一款有关虚拟狗的应用程序,以帮助人们照顾他们的狗。屏幕之一可以让您用十五秒的时间宠爱狗五次。每当我尝试加载屏幕时,该应用程序都会冻结。代码在viewDidLoad()内部
while timesPetted < 5 {
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
timer += 1
if timer == 15 {
self.failureLabel.isHidden = false
self.reset.isHidden = false
self.timesPetted = 0
}
})
}
当我删除while循环时,屏幕可以正常加载并完美运行,但是(显然)没有时间限制。如果将while循环移出viewDidLoad(),则会收到一条错误消息,提示Xcode为“期望的声明”。
答案 0 :(得分:1)
请使用设置为在15秒后过期的计时器
let timer = Timer.scheduledTimer(withTimeInterval: 15.0, repeats: false) { timer in
self.failureLabel.isHidden = false
self.reset.isHidden = false
self.timesPetted = 0
}
或者如果您想使用DispatchQueue,则只能使用一次
DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
self.failureLabel.isHidden = false
self.reset.isHidden = false
self.timesPetted = 0
}
答案 1 :(得分:0)
由于timesPetted的值,它显示while循环无限运行。一旦进入while循环,timesPetted的值就不会改变。
要解决您的问题,您可以如下更改代码:-
您必须在代码中的某些位置更新timesPetted值。 可以说,timesPetted在名为“ Petting”的函数中已更改,因此在调用此功能时要进行检查,这限制了用户只能进行5次检查直到进行15秒的检查。如下所示。
func petting() {
if reset.isHidden && timesPetted <= 5{ // here the reset.isHidden will become false in DispatchQueue (present in viewDidLoad) once the 15 seconds have been passed.
timesPetted += 1
}
}
还要确保将这行代码添加到viewDidLoad中。
DispatchQueue.main.asyncAfter(deadline: .now() + 15) {
self.failureLabel.isHidden = false
self.reset.isHidden = false
self.timesPetted = 0
}