0

我试图UIButton通过调用以下flash()给出的方法来点亮一堆充满活力的子类实例:

func flash(delay: TimeInterval = 0.0) {
    DispatchQueue.main.asyncAfter(deadline: .now() + delay)  { [weak self] in
        guard let strongSelf = self else { return }
        let flashView = UIView(frame: strongSelf.bounds)
        strongSelf.insertSubview(flashView, at: 0)
        flashView.backgroundColor = strongSelf.color
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { flashView.removeFromSuperview() }
    }
}

使用此功能,我可以循环遍历一组按钮,触发持续 0.1 秒的闪烁效果,闪烁是由活力层改变其flashView后面的实例引起的。

DispatchQueue.main.asyncAfter通过在调用中调用此函数是否有任何缺点DispatchQueue.main.asyncAfter

4

2 回答 2

0

不,这里不需要,[weak self] 因为这个 GCD (Grand Central Dispatch) 不会导致保留周期

DispatchQueue.main.asyncAfter(deadline: .now() + delay)  { /*[weak self] in */

在这里检查最后一部分

于 2018-12-24T12:09:23.343 回答
0

我没有看到嵌套调用有任何问题DispatchQueue.main.asyncAfter()。但是,每次调用您的 flash 函数都会创建一个新的子视图并将其添加到您的视图中。这将创建一个不断增加的子视图堆栈,以在动画运行时累积(这将导致您的内存使用量缓慢增长,直到您释放按钮视图。

您应该重构闪烁的视图以将实例变量设置为单个子视图,并更改其颜色以导致闪烁,而不是每次都添加一个新的。

于 2018-12-24T12:42:53.137 回答