如何使用2个主线程而不会出现滞后?

问题描述

在我的应用中,我正在使用WebSockets和视频流。 在后视图(全屏)上播放实时流,并在其上方显示UIViews。 我需要非常可靠地显示两个视图(视频和UIView块)。

当我将addSubview包装到dispatchQueue.main.async {}中时,我的视频滞后于屏幕上出现UIView块的那一刻。

因此,我可以以某种方式将它们分成2个不同的主线程,以便它们都能可靠地显示在屏幕上而不会滞后吗?

解决方法

即使在第一位置不需要它,延迟也可能表示UI操作在下一个运行循环中发生。我建议使用以下扩展名:

extension DispatchQueue {
    static public func asyncMainIfNeeded(work: @escaping () -> Void) {
        if Thread.isMainThread {
            work()
            return
        }
        DispatchQueue.main.async {
            work()
        }
    }
}

DispatchQueue.main.async相比,它将另外执行一次检查是否完全需要异步主线程分配。现在代替:

DispatchQueue.main.async {
    //Your UI operation
}

您会这样做:

DispatchQueue.asyncMainIfNeeded {
    //Your UI operation
}