如何在方法运行时停止它';它在swiftui中运行

如何在方法运行时停止它';它在swiftui中运行,swiftui,Swiftui,我有一个问题,我必须找到解决办法。如果用户按下取消按钮,我必须立即停止“启动”方法。 我还没有解决这个问题,因为我不能在方法运行时阻止它,而只能在执行的末尾或开始时阻止它 ContentView: Button(action: { self.Starting() DispatchQueue.main.asyncAfter(deadline: .init(uptimeNanoseconds: 0), execute: self.workItem) }) { Text("START")

我有一个问题,我必须找到解决办法。如果用户按下取消按钮,我必须立即停止“启动”方法。 我还没有解决这个问题,因为我不能在方法运行时阻止它,而只能在执行的末尾或开始时阻止它

ContentView:

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)
...

没有办法立即停止您的功能。您只能在下次执行时停止并取消函数的未来调用。无法立即停止函数。您只能在下一次执行时停止并取消函数的未来调用。