首页 > 解决方案 > 当观察到可能发布在“用于注册观察者的线程之外的线程上”的通知时,如何确保线程安全的 UI 工作?

问题描述

我观察一个AVPlayer结束播放的时间,以便UIAlert在结束时间呈现一个。

NotificationCenter.default.addObserver(
  self,
  selector: #selector(presentAlert),
  name: .AVPlayerItemDidPlayToEndTime,
  object: nil
)

我有多个用户报告警报发生在他们不打算的地方,例如重播后的视频中间,以及其他视图。我自己无法重现这一点,但我的猜测是这是一个线程问题,因为AVPlayerItemDidPlayToEndTime说“系统可能会在用于注册观察者的线程之外的线程上发布此通知。”

那么如何确保主线程上存在警报?我应该从我的presentAlert函数中分派到主队列,还是添加上面的观察者,addObserver(forName:object:queue:using:)而不是传入主操作队列?

标签: ioscocoa-touchnsnotificationcenterfoundation

解决方案


警报和任何其他 UI 操作应始终在主线程上执行。您可以使用 Thread.isMainThread 来验证线程是否为主线程。

如果它已经在主线程上,那么延迟不是由于这个原因。AVPlayerItemDidPlayToEndTime 延迟可能是由于使用了串行队列。需要一些代码片段来确定。


推荐阅读