如何阻止函数在 Swift 3.0 中运行

Ser*_*mer 4 uiviewanimation ios swift

我有一个函数可以开始播放异步运行的动画(在后台)。使用完成处理程序无限期调用此动画(见下文)。有没有办法在按下另一个按钮时关闭此功能?

这是我的代码:

func showAnimation() {
    UIView.animate(withDuration: 1, animations: {
        animate1(imageView: self.Anime, images: self.animation1)
    }, completion: { (true) in
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
            self.showAnimation() // replay first showAnimation
        }
    }) 
 }
Run Code Online (Sandbox Code Playgroud)

然后按下另一个按钮,我们关闭上述功能

showAnimation().stop();
Run Code Online (Sandbox Code Playgroud)

谢谢

Cha*_*tka 5

有很多方法可以做到这一点。最简单的方法是拥有一个 Boolean 属性(您应该正确地将其设置为原子),您可以在asyncAfter块中检查该属性,并且showAnimation()如果它为真,则不要再次调用。

另一件事你可以做的,我喜欢更复杂的任务做什么,就是用OperationQueue替代DispatchQueue。这允许您单独或一次性取消操作,甚至挂起整个队列(显然不要挂起主队列或调用removeAllOperations()它,因为那里可能还有其他与您的代码无关的操作)。


rma*_*ddy 5

您可以向该类添加一个属性,以充当指示是否应运行动画的标志。

var runAnimation = true

func showAnimation() {
    if !runAnimation { return }

    UIView.animate(withDuration: 1, animations: {
        animate1(imageView: self.Anime, images: self.animation1)
    }, completion: { (true) in
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
            if runAnimation {
                self.showAnimation() // replay first showAnimation
            }
        }
    }) 
}
Run Code Online (Sandbox Code Playgroud)

然后在按钮处理程序中停止动画,您只需执行以下操作:

runAnimation = false
Run Code Online (Sandbox Code Playgroud)

请注意,这不会停止当前运行的 1 秒动画。这只是防止更多的动画。