使用UIButton印刷机打破Swift do-while循环是否需要一个新线程?

时间:2015-01-29 16:58:25

标签: multithreading swift uibutton do-while

在下面的程序中,我有两个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")
    }
}

1 个答案:

答案 0 :(得分:4)

按钮操作在主线程上执行,所有UI交互也是如此。因为你正在执行一个长期运行的&#34; (它不是,但这是意图)主线程上的动作,在startLoop终止之前不能进行进一步的UI交互,因此不会识别按钮按下。

您的计数循环必须在不同的线程上执行,才能执行您想要执行的操作。

请注意&#34;在另一个线程上&#34;仍然意味着您有多种选择,具有不同的优点和缺点:

  • NSThread - 显然,这会创建一个额外的线程

  • pthread - 显然,这会创建一个额外的线程,但应该在礼貌的社会中避免

  • NSOperationQueue - 隐藏抽象背后的线程创建并允许重用线程

  • dispatch_queue - 再次,这隐藏了抽象背后的线程创建和管理,并且在大多数情况下是使用这些天的首选机制。