快速停止循环并用按钮继续

时间:2017-07-05 20:03:38

标签: swift macos loops cocoa

是否可以停止for循环并使用按钮继续它和停止的位置。

我的意思是这样的:

for x in 0..<5 {

   if x == 3 {
      // show a button
      // this button have to be pressed
      // which do some tasks
      // when all tasks are finished > 
      // continue this loop at the stopped point
   } 
}
这可能吗?如果有,怎么样?

1 个答案:

答案 0 :(得分:1)

简答:使用信号量

更长的答案:

您的情况是一个更一般情况的示例,如何暂停某些计算,保存其当前状态(局部变量,调用堆栈等),然后从同一点恢复它,并恢复所有状态。

某些语言/系统提供协同程序来支持此功能,其他语言/系统提供更深奥的调用当前延续,您(目前)Swift ......

你所拥有的是 Grand Central Dispatch (GCD),在Swift中通过Dispatch提供,它为执行并发异步任务和它们之间的同步提供支持。其他并发机制如pthread也可用,但建议使用GCD。

使用GCD解决方案的概要是:

  • 执行循环作为异步并发任务。它必须在主线程上执行,否则你将死锁......
  • 当你想暂停时:
    • 创建信号量
    • 启动另一个异步任务以显示按钮,运行其他作业等。此新任务必须在信号完成时发信号通知信号量。新任务可以调用主线程来执行UI操作。
    • 您的循环任务在信号量上等待,这将阻止循环任务,直到按钮任务发出信号为止。

这可能听起来很复杂,但使用Swift block 语法和Dispatch非常简单。但是你需要先阅读GCD!

或者,您可以询问是否可以将解决方案重组为多个部分,因此不需要保存/恢复当前状态。您可能会发现延续传递样式这样的设计很有用,使用Swift的块也很容易。

HTH