我在修改对象的属性后调用DispatchQueue.main.asyncAfter
方法(我用KVO触发它)。我只显示一秒钟的确认视图,然后运行一个块,在UI上执行另一个操作(弹出一个viewcontroller)。问题是,当我从UICollectionViewCell
调用此工作正常,但当我从我的应用程序中的另一个特定UICollectionViewCell
调用此方法时,它会冻结。该方法以UIView
。
public func showConfirmViewWith(title: String!, frame: CGRect? = screenBounds, afterAction: (() -> Void)?) {
let confirm = ConfirmationView(frame: frame!, title: title)
self.addSubview(confirm)
confirm.checkBox?.setCheckState(.checked, animated: true)
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1) ) {
if afterAction != nil {
afterAction!()
}
confirm.removeFromSuperview()
}
}
当它冻结Dispatch中的代码永远不会被调用时,我内部有一个断点,但永远不会到达那一点。
UDPATE 这是我暂停执行时的堆栈跟踪:
答案 0 :(得分:0)
我解决了这个棘手的问题。首先,DispatchQueue.main.asyncAfter调用没有任何问题。该应用程序进入循环,并没有任何锁定的迹象。我运行了分析器,发现一些约束的布局被反复调用。我在collectionViewCell里面有一个tableView,在完成对asyncAfter的调用时有一个动画。问题是overriden方法layoutSubviews里面有一个tableView.reloadData(),所以每次我试图在动画异步调用后退出时,都会调用layoutsubviews并反复触发reloadData()。我不确定为什么reloadData存在,但现在似乎工作正常。