我正试图通过调用以下给出的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
,此功能是否有任何缺点?
答案 0 :(得分:0)
不,这里不需要[weak self]
,因为此GCD(大中央调度)不会引起保留周期
DispatchQueue.main.asyncAfter(deadline: .now() + delay) { /*[weak self] in */
检查最后一节Here
答案 1 :(得分:0)
我看不到嵌套调用DispatchQueue.main.asyncAfter()
的任何问题。但是,每次调用Flash函数都会创建一个新的子视图并将其添加到视图中。这将创建不断增加的子视图堆栈,以在动画运行时进行累积(这将导致您的内存使用量缓慢增长,直到释放按钮视图为止。
您应该重构闪烁的视图,以使实例变量具有一个子视图,并更改其颜色以引起闪烁,而不是每次都添加一个新的变量。