iOS(Swift):使用DispatchQueue.main.asyncAfter

时间:2018-12-24 12:03:31

标签: ios swift uibutton subview dispatch-queue

我正试图通过调用以下给出的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,此功能是否有任何缺点?

2 个答案:

答案 0 :(得分:0)

不,这里不需要[weak self],因为此GCD(大中央调度)不会引起保留周期

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

检查最后一节Here

答案 1 :(得分:0)

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

您应该重构闪烁的视图,以使实例变量具有一个子视图,并更改其颜色以引起闪烁,而不是每次都添加一个新的变量。