【发布时间】:2021-02-13 18:53:52
【问题描述】:
我正在执行一组任务,为了随着时间的推移跨越它们,我使用了Thread.sleep(forTimeInterval: ... ) 它在执行之间添加了暂停。
然后,在主屏幕上我有控制器,可以干预线程执行,所以当控制器应用时我想取消睡眠。并从用户选择的地方开始。
所以,我试过了
Thread.exit() - 它以错误终止程序。
如何退出(或刷新)当前线程并从我想要的地方开始? 按钮(即控制器)控制线程暂停的方式有哪些?
实际发生的情况是,如果我取消,它会继续从同一个地方运行...
let queue = DispatchQueue(label: "Actions Queue")
let delay: Double = 5
var actions = ["action 1", "action 2", "action 3", "action 4", "action 5"]
// every time task finishes, it calls for the following task (with delay)
queue.sync {
// sets an interval, that continues an action
Thread.sleep(forTimeInterval: TimeInterval(delay))
// continue an action
}
// heres how I've tried in main view, but it doesn't work
queue.sync {
Thread.current.cancel()
}
编辑:
例如,cancel() 在这里做什么?以及为什么exit()不能应用于Thread.current,而只能应用于Thread.
“您可以使用这些语义来取消线程的执行或确定线程是否仍在执行或已完成其任务”。好吧,如果我cancel()。什么,然后重新开始?
queue.sync {
Thread.sleep(forTimeInterval: TimeInterval(10.0))
// do something
}
Button("...") {
queue.sync {
Thread.current.cancel()
}
}
【问题讨论】:
-
如果我需要改进问题,请在 cmets 中告诉我;以便我知道如何修复它以提高讨论质量
-
我认为您正在将 GCD 与线程混合。虽然他们的目标是相似的,但他们处于完全不同的水平,所以混合它们从来都不是一个好主意。如果您需要在任务之间进行更复杂的交互,我建议您使用 GCD 和 work items 或 OperationQueue 和一组 Operations。
-
@ScorpiCon 我想要实现的是 - 让演示文稿在幻灯片之间以预定时间运行,但如果用户想要返回(或向前);它应该直接切到上一张幻灯片,并以预定暂停的相同方式继续。你对此有什么想法吗?
标签: swift multithreading ios-multithreading