从 Timer 选择器函数 Swift 调用函数的完成处理程序

Posted

技术标签:

【中文标题】从 Timer 选择器函数 Swift 调用函数的完成处理程序【英文标题】:Calling completion handler of a function from Timer selector function Swift 【发布时间】:2019-06-24 11:30:43 【问题描述】:

我有 animateButtons() 函数,只有在动画完成时我才需要设置完成处理程序。问题是在animateButtons() 中,我只能在imageView.startAnimating() 之后设置完成处理程序,因此整个时间都会受到影响,因为它的完成用于启动其他动画。我在另一篇文章中读到了同样的问题,我应该设置一个 NSTimer 来设置完成处理程序,正如我真正想到的那样,但我真的不知道该怎么做。我已将 NSTimer 设置为调用 setCompletion() 函数,但如何将其设置为调用 animateButtons() 完成处理程序?

你能指出我正确的方向吗?

这是函数和选择器函数:

static func animateButtons(completed: @escaping(Bool) ->(), imageView: UIImageView, images: [UIImage]) 
        imageView.animationImages = images
        imageView.animationDuration = 1.0 // check duration
        imageView.animationRepeatCount = 1
        imageView.startAnimating()

        _ = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(setCompletion), userInfo: nil, repeats: false)
        // completed(true)


@objc func setCompletion() 


【问题讨论】:

【参考方案1】:

你可以尝试使用内联回调

static func animateButtons(completed: @escaping(Bool) ->(), imageView: UIImageView, images: [UIImage]) 
    imageView.animationImages = images
    imageView.animationDuration = 1.0 // check duration
    imageView.animationRepeatCount = 1
    imageView.startAnimating() 
    Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false, block:  (t) in 
        t.invalidate()
        completed(true)
    )

顺便说一句,之后的派遣也可以完成这项工作

static func animateButtons(completed: @escaping(Bool) ->(), imageView: UIImageView, images: [UIImage]) 
    imageView.animationImages = images
    imageView.animationDuration = 1.0 // check duration
    imageView.animationRepeatCount = 1
    imageView.startAnimating()
    DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) 
        completed(true)
    

【讨论】:

哇!太好了,再次感谢。我刚试过你的Timer,效果很好。我也会尝试GDC 解决方案,以便了解更多信息。再次感谢您。【参考方案2】:

方法 1(我更喜欢这个)(如果您正在制作 Gif 图像的动画) 使用像 Gifu https://github.com/kaishin/Gifu 这样的第三方库来计算你的 gif 的运行时间。即使您将来更改 gif 图像,它也可以工作。

    static func animateButtons(completed: @escaping(Bool) ->(), imageView: UIImageView, images: [UIImage]) 
imageView.prepareForAnimation(withGIFNamed: "welcome", loopCount: 1) 
            self.imageView.startAnimatingGIF()
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.2 + self.imageView.gifLoopDuration, execute: 
                // Do your Task after animation completes
                )
        

方法二(计算动画的运行时间并设置定时器)

【讨论】:

谢谢!我绝对会试一试的。看起来很有用。

以上是关于从 Timer 选择器函数 Swift 调用函数的完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章

装饰器

在 Swift 中使用 Timer 不断调用 api 请求

在Swift中加载UICollectionView时的加载器/微调器

从 Swift 调用带有数组指针和 int 指针的 C 函数

装饰器函数

从 C 调用 Swift 的最佳方法是啥?