Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何取消延迟的线程?_Swift_Multithreading_Ios Multithreading - Fatal编程技术网

Swift 如何取消延迟的线程?

Swift 如何取消延迟的线程?,swift,multithreading,ios-multithreading,Swift,Multithreading,Ios Multithreading,我正在执行一组任务,为了跨越这些任务,我使用了Thread.sleep(forTimeInterval:…)它在执行之间添加暂停 然后,在主屏幕上我有控制器,可以干预线程执行,所以当控制器应用时,我想取消睡眠。并从用户选择的位置开始。 所以,我试过了 Thread.exit()-它会错误地终止程序 如何退出(或刷新)当前线程并从我想要的位置开始? 通过按钮(即控制器)控制线程暂停的方式有哪些 实际发生的是,如果我取消,它会继续从同一个地方运行 let queue = DispatchQueue(

我正在执行一组任务,为了跨越这些任务,我使用了
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
,而只能应用于
线程。

“您可以使用这些语义来取消线程的执行,或者确定该线程是否仍在执行或已完成其任务”。好的,如果我
cancel()
。什么,然后再开始

queue.sync {
    Thread.sleep(forTimeInterval: TimeInterval(10.0))
    // do something
}

Button("...") {
    queue.sync {
        Thread.current.cancel()
    }
}

一般来说,我建议不要睡在线程上。首先,我们没有先发制人的取消。其次,这是对资源的低效利用,不必要地占用了这条线索

如果你想在一段时间后做某事,你有几个选择:

  • 您可以创建一个,将其与一起分派,然后如果您不希望发生这种情况

  • 更简单的是,如果你想停止的话,只需要安排一个时间,然后就可以了

  • 如果您想每x秒执行一次可取消的任务,那么一个重复的
    计时器可能是最简单的,因为您可以
    使其无效,并在一个步骤中停止整个重复序列。(它还避免了计时器合并问题。)


    你说:

    我试图实现的是——在幻灯片之间以预定时间运行演示文稿,但如果用户希望返回(或前进);它应该直接切到上一张幻灯片,并以预定暂停的相同方式继续


    我建议使用一个重复的
    计时器
    进入下一张幻灯片。如果用户手动切换到另一张幻灯片,
    使旧计时器无效,并创建一个新的重复
    计时器

    如果我需要改进问题,请在评论中告诉我;因此,我知道如何修复它以进行更高质量的讨论。我认为您将GCD与线程混合在一起。虽然他们的目标相似,但他们的水平完全不同,所以把他们混合在一起从来都不是一个好主意。如果您需要在任务之间进行更复杂的交互,我建议您使用或与一组进行交互。@ScorpiCon我试图实现的是-在幻灯片之间以预定时间运行演示文稿,但如果用户希望返回(或前进);它应该直接切到上一张幻灯片,并以预定暂停的相同方式继续。你对此有什么想法吗?谢谢你的回答和研究阅读的链接!让我看得更清楚了!当前正在尝试使用计时器正确实现此功能。程序的响应时间比Threading.Cool快1000倍。FWIW,GCD模式应该不会慢一些,但对于要取消的重复操作,
    Timer
    只是一种简单得多的方法。在您的GCD实现中可能还发生了其他一些事情,但我想现在您已经有了更好的解决方案,这并不重要。。。