延迟执行塞

时间:2016-09-20 06:05:23

标签: ios swift

我有一个bar button item,它位于下一个视图控制器上。我在条形按钮项上实现了show segue,它第一次延迟了2秒,然后是正常的。

我使用DispatchQueue如下,但它仍然使用相同的

  @IBAction func addPressed(_ sender: AnyObject) {
        DispatchQueue.main.async(execute: {
            self.performSegue(withIdentifier: "showDetail",sender: self)
        })

    }

这就是我在第二个VC中所拥有的。

override func viewDidLoad(){
        super.viewDidLoad()

    firstBtn.layer.borderWidth = 3
    firstBtn.layer.borderColor = UIColor.white.cgColor

    secondBtn.layer.borderWidth = 3
    secondBtn.layer.borderColor = UIColor.white.cgColor


    do{
        let correctSoundUrl: URL = URL(fileURLWithPath: Bundle.main.path(forResource: "btnTap", ofType: "wav")!)
        self.goalsTapPlayer = try AVAudioPlayer(contentsOf: correctSoundUrl)
        self.goalsTapPlayer.prepareToPlay()
    }
    catch{}

}

1 个答案:

答案 0 :(得分:2)

DispatchQueue.main.async这里什么也没做,因为如果从按下按钮调用它,它已经在主线程上执行了。

@IBAction func addPressed(_ sender: AnyObject) {
        self.performSegue(withIdentifier: "showDetail",sender: self)
}

您可能在下一个控制器的prepareForSegueviewDidLoadviewWillAppear中遇到问题。

如果你在这些函数中有一些繁重的操作,你应该尝试在后台线程上执行它们。

DispatchQueue.global(qos: .background).async {
    //Heavy operation
    //...
    DispatchQueue.main.async {
        //Potential update of UI
    }
}

在您的情况下,您可以尝试在后台执行audioplayerloading

DispatchQueue.global(qos: .background).async {
    do{
        let correctSoundUrl: URL = URL(fileURLWithPath: Bundle.main.path(forResource: "btnTap", ofType: "wav")!)
        self.goalsTapPlayer = try AVAudioPlayer(contentsOf: correctSoundUrl)
        self.goalsTapPlayer.prepareToPlay()
    }
    catch{}
}