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

问题描述

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

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

在python中,存在greenletgevent)的概念,该概念允许进行简单的上下文切换,而不必是真正的线程。这对我来说是完美的。 swift中有这种机制吗?

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

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

解决方法

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

  • 首先,我们从不对主线程执行任何计算上昂贵的事情。我们绝不能出于任何原因阻塞主线程。这会导致可怕的UX(您的应用程序可能似乎被冻结),并且您冒着被OS监视程序进程杀死的风险(该程序正在寻找似乎被冻结并阻塞主线程的应用程序)。

  • 第二,如果计算两个真正独立的计算,我们不会增加尝试在它们之间进行切换的开销和复杂性。我们只需要使用GCD将它们独立地分配到后台队列即可。

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

FWIW,单独分配这两个独立任务的过程更简单,并且设备资源的使用效率更高。只需将更新同步到模型对象即可。调度组是跟踪两个独立的并发任务何时完成的好方法。