在下面的程序中,我有两个for循环从0到20计数,然后再回到0.这些循环位于do-while循环中,检查布尔值。按下按钮可以更改布尔值。
我在SO上搜索并搜索了答案。有人提出同样的问题,但没有人回答。他的问题出现在这里: https://stackoverflow.com/q/27223106/3140521
我认为答案是使用新线程,但有更简单的方法吗?
谢谢,
利
import UIKit
class ViewController: UIViewController {
var keepGoing:Bool = true
var i:Int = 0
@IBOutlet weak var mainLabel: UILabel!
@IBAction func stopLoop(sender: UIButton) {
mainLabel.text = "Off"
keepGoing = false
}
@IBAction func startLoop(sender: UIButton) {
keepGoing = true
mainLabel.text = "On"
do {
for i = 1; i < 20; ++i {
println(i)
}
for i = 20; i > -1; --i {
println(i)
}
} while keepGoing == true
println("Loop Broken")
}
}
答案 0 :(得分:4)
按钮操作在主线程上执行,所有UI交互也是如此。因为你正在执行一个长期运行的&#34; (它不是,但这是意图)主线程上的动作,在startLoop
终止之前不能进行进一步的UI交互,因此不会识别按钮按下。
您的计数循环必须在不同的线程上执行,才能执行您想要执行的操作。
请注意&#34;在另一个线程上&#34;仍然意味着您有多种选择,具有不同的优点和缺点:
NSThread - 显然,这会创建一个额外的线程
pthread - 显然,这会创建一个额外的线程,但应该在礼貌的社会中避免
NSOperationQueue - 隐藏抽象背后的线程创建并允许重用线程
dispatch_queue - 再次,这隐藏了抽象背后的线程创建和管理,并且在大多数情况下是使用这些天的首选机制。