再次按下按钮时GCD取消并重新启动队列

时间:2017-04-07 12:21:11

标签: ios swift swift3 grand-central-dispatch

简单地说,我有一个添加到队列的按钮,或者我相信它是如何工作的 - 我刚刚开始使用GCD。如果我在我的应用程序中按下按钮两次,它会并行运行这两个进程,进度条在它们之间来回转换,我想停止队列的所有其他实例并执行一个新的实例,如果这是有意义的,我没有理解这个术语......

@IBAction func makePi(_ sender: UIButton) {
    piProgress.progress = 0.0
    let queue1 = DispatchQueue(label: "com.appcoda.queue1", qos: DispatchQoS.userInitiated)
    queue1.async {
        let currentAmount = Int(self.randNum.value)
        var gcdCounter = 0

        for n in 1...currentAmount {
            if self.gcd(self.random(max: Int(self.randRange.value)), self.random(max: Int(self.randRange.value))) == 1{
                gcdCounter += 1
            }
            if n % 1000 == 0 {
                DispatchQueue.main.async {
                    self.piProgress.setProgress(Float(Double(n)/Double(currentAmount)), animated: true)
                }
            } else if n == currentAmount {
                DispatchQueue.main.async {
                    self.piProgress.setProgress(1.0, animated: true)
                }
            }
        }

        let piFinal = sqrt(Double((6/Double((Double(gcdCounter)/Double(currentAmount))))))
        let roundedAccuracy: Double = ((piFinal-Double.pi)/Double.pi*100).roundTo(places: 6)

        DispatchQueue.main.async {
            self.piLabel.text = String(piFinal)
            self.piAccuracy.text = "Accuracy: \(roundedAccuracy)%"
        }
    }
}

我只需要所有其他queue1.async来停止......

P.S。如果我做了什么显然错了,请帮助^^谢谢。

0 个答案:

没有答案