DispatchQueue.main.asyncAfter方法冻结特定调用中的UI

时间:2017-01-06 01:02:11

标签: ios swift grand-central-dispatch dispatch-async

我在修改对象的属性后调用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 这是我暂停执行时的堆栈跟踪:

First time I paused the execution

1 个答案:

答案 0 :(得分:0)

我解决了这个棘手的问题。首先,DispatchQueue.main.asyncAfter调用没有任何问题。该应用程序进入循环,并没有任何锁定的迹象。我运行了分析器,发现一些约束的布局被反复调用。我在collectionViewCell里面有一个tableView,在完成对asyncAfter的调用时有一个动画。问题是overriden方法layoutSubviews里面有一个tableView.reloadData(),所以每次我试图在动画异步调用后退出时,都会调用layoutsubviews并反复触发reloadData()。我不确定为什么reloadData存在,但现在似乎工作正常。