来回切换上下文的最简单方法(调度)

Simplest way to switch context back and forth (dispatching)

我有两个执行独立计算的 类。这里为了简单起见,我将用函数calc1calc2来表示它们。在每个功能的一些随机位置,我需要睡一会儿。我不想做 calc1 然后 calc2,而是想在它们之间来回切换。

我可以使用线程,但乍一看似乎设计过度了。另外,这两个函数需要在主线程上,因为它们处理用户界面。我不需要不同的线程。我只需要从一个上下文切换到另一个上下文,然后回到原来的位置。

在python中,有greenletgevent)的概念,允许简单的上下文切换,而不是真正的线程。那将非常适合我的需要。 swift有这样的机制吗?

func calc1() {
...
sleep(300) // go to calc2
...
}

func calc2() {
...
sleep(200) // resume calc1
...
}

这种在主线程上的两个计算量大的计算之间交替切换的想法是行不通的。

  • 首先,我们从不在主线程上做任何计算量大的事情。我们不应该以任何理由阻塞主线程。它会导致可怕的用户体验(您的应用程序可能看起来已冻结)并且您可能会冒着 OS 看门狗进程(正在寻找似乎已冻结并阻塞主线程的应用程序)杀死该应用程序的风险。

  • 其次,如果计算两个真正独立的计算,我们不会增加尝试在它们之间切换的开销和复杂性。我们只会使用 GCD 将它们独立地分派到后台队列。

因此,此类流程的解决方案是将这两个任务同时分派到后台队列上的 运行,分派到一个并发队列或两个专用队列。但关键是在主线程之外并行执行复杂的计算,然后将定期 UI 更新分派回主线程。但始终保持主线程空闲以响应用户输入、系统事件等

FWIW,这个分别分派这两个独立任务的过程更简单,并且可以更有效地利用设备资源。只需同步模型对象的更新。调度组是跟踪两个独立并发任务何时完成的好方法。