如何在方法运行时停止它';它在swiftui中运行
我有一个问题,我必须找到解决办法。如果用户按下取消按钮,我必须立即停止“启动”方法。 我还没有解决这个问题,因为我不能在方法运行时阻止它,而只能在执行的末尾或开始时阻止它 ContentView:如何在方法运行时停止它';它在swiftui中运行,swiftui,Swiftui,我有一个问题,我必须找到解决办法。如果用户按下取消按钮,我必须立即停止“启动”方法。 我还没有解决这个问题,因为我不能在方法运行时阻止它,而只能在执行的末尾或开始时阻止它 ContentView: Button(action: { self.Starting() DispatchQueue.main.asyncAfter(deadline: .init(uptimeNanoseconds: 0), execute: self.workItem) }) { Text("START")
Button(action: {
self.Starting()
DispatchQueue.main.asyncAfter(deadline: .init(uptimeNanoseconds: 0), execute: self.workItem)
}) {
Text("START")
}
Button(action: {
self.workItem.cancel()
}) {
Text("CANCEL")
}
启动方法:
func Starting() {
self.workItem = DispatchWorkItem {
DispatchQueue.main.async {
self.impostazioniChek=true
}
DispatchQueue.global().async {
if (self.pm.MarksSwitch)
{
sleep(UInt32(self.MarksT))
self.Marks()
}
if (self.pm.ReadySwitch)
{
sleep(UInt32(self.ReadyT))
self.Ready()
}
self.Start()
sleep(3)
DispatchQueue.main.async {
self.tm.start()
}
}
}
}
您不能取消,因为 1) 几乎所有的时间工作项都在主(UI)队列上运行,所以阻止它 2) 在工作项内部,没有取消对
的检查。DispatchWorkItem.cancel()仅将其标记为已取消,但不会停止执行您必须执行的操作
因此,要使此工作正常,需要将工作项中与UI无关的所有内容显式重定向到.background
队列中
代替
DispatchQueue.main.asyncAfter(deadline: .init(uptimeNanoseconds: 0), execute: self.workItem)
使用
而不是
DispatchQueue.global().async {
if (self.pm.MarksSwitch)
只需使用(因为它已经在后台)
我不确定是什么(可能它也应该在后台队列上运行)
第二次,通过定期检查取消时添加块内中断,如下所示
...
}
if self.workItem.isCancelled { // add as many such as needed
return
}
if (self.pm.ReadySwitch)
...
您不能取消,因为
1) 几乎所有的时间工作项都在主(UI)队列上运行,所以阻止它
2) 在工作项内部,没有取消对的检查。DispatchWorkItem.cancel()仅将其标记为已取消,但不会停止执行您必须执行的操作
因此,要使此工作正常,需要将工作项中与UI无关的所有内容显式重定向到.background
队列中
代替
DispatchQueue.main.asyncAfter(deadline: .init(uptimeNanoseconds: 0), execute: self.workItem)
使用
而不是
DispatchQueue.global().async {
if (self.pm.MarksSwitch)
只需使用(因为它已经在后台)
我不确定是什么(可能它也应该在后台队列上运行)
第二次,通过定期检查取消时添加块内中断,如下所示
...
}
if self.workItem.isCancelled { // add as many such as needed
return
}
if (self.pm.ReadySwitch)
...
没有办法立即停止您的功能。您只能在下次执行时停止并取消函数的未来调用。无法立即停止函数。您只能在下一次执行时停止并取消函数的未来调用。