问题描述
在我的应用中,我正在使用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
}