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

标签 swift macos loops cocoa

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

我的意思是这样的:

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
   } 
}

这可能吗?如果是,怎么办?

最佳答案

简答:使用信号量

更长的答案:

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

一些语言/系统提供协程来支持这一点,其他语言/系统提供更深奥的当前延续调用,您(当前)Swift 都无法使用...

您所拥有的是 Grand Central Dispatch (GCD),它在 Swift 中通过 Dispatch 提供,它支持执行并发异步任务以及它们之间的同步。 pthread 等其他并发机制也可用,但倾向于推荐 GCD。

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

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

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

或者,您可以询问是否可以将您的解决方案重组为多个部分,这样就不需要保存/恢复当前状态。您可能会发现诸如continuation passing style 之类的设计很有用,使用 Swift 的 block 也很容易。

HTH

关于快速停止循环并使用按钮继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44935036/

相关文章:

ios - Swift:无法使用 Firebase 将数据同步到 TableView

swift - 在基于 swift 的应用程序中与枚举成员交互

ruby - "Pow is installed"现在出现在我所有的网站上

c - 从 Xcode 在 OS X 本地安装编译代码

javascript - 使用 jQuery 连续移动元素

ios - 下一个轨道AVPlayer如何

macos - 如何检测我的应用程序是否已沙盒化?

java - 如何在 Java 中打印字符串数组的偶数和奇数位置字符?

java - 由于某种奇怪的原因,方法被调用两次?

iOS SqLite 和 Swift。数据库存储在哪里