Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.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_Macos_Loops_Cocoa - Fatal编程技术网

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

Swift 快速停止循环并用按钮继续,swift,macos,loops,cocoa,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 stopp

是否可以停止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
   } 
}
0中x的
。。
//在停止点继续此循环
} 
}
这可能吗?如果是,怎么做?

简短回答:使用信号灯

详细回答:

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

一些语言/系统提供协同程序来支持这一点,其他语言/系统则提供更为深奥的当前延续调用,这两种语言/系统都不适用于您(当前)Swift

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

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

  • 将循环作为异步并发任务执行。它不能在主线程上执行,否则会死锁
  • 当您希望暂停时:
    • 创建一个信号量
    • 启动另一个异步任务以显示按钮、运行其他作业等。此新任务完成后必须向信号量发送信号。新任务可能会调用主线程来执行UI操作
    • 循环任务等待信号量,这将阻止循环任务,直到按钮任务发出信号为止
这听起来可能很复杂,但使用快速块语法和
Dispatch
非常简单。不过,你确实需要先阅读GCD

或者,您可以询问是否可以将解决方案重组为多个部分,以便不需要保存/恢复当前状态。你可能会发现像延续传球风格这样的设计很有用,这同样很容易使用斯威夫特的方块