ios - 当观察到可能发布在“用于注册观察者的线程之外的线程上”的通知时,如何确保线程安全的 UI 工作?
问题描述
我观察一个AVPlayer
结束播放的时间,以便UIAlert
在结束时间呈现一个。
NotificationCenter.default.addObserver(
self,
selector: #selector(presentAlert),
name: .AVPlayerItemDidPlayToEndTime,
object: nil
)
我有多个用户报告警报发生在他们不打算的地方,例如重播后的视频中间,以及其他视图。我自己无法重现这一点,但我的猜测是这是一个线程问题,因为AVPlayerItemDidPlayToEndTime说“系统可能会在用于注册观察者的线程之外的线程上发布此通知。”
那么如何确保主线程上存在警报?我应该从我的presentAlert
函数中分派到主队列,还是添加上面的观察者,addObserver(forName:object:queue:using:)
而不是传入主操作队列?
解决方案
警报和任何其他 UI 操作应始终在主线程上执行。您可以使用 Thread.isMainThread 来验证线程是否为主线程。
如果它已经在主线程上,那么延迟不是由于这个原因。AVPlayerItemDidPlayToEndTime 延迟可能是由于使用了串行队列。需要一些代码片段来确定。
推荐阅读
- git - git 权限更改 pycharm 与分支比较
- php - php 和 mysql 在 date_begin 和 date_end 之间显示每日收入
- python - 如何解决速率限制 API?
- c# - 如何遍历包含一个字典的字典,该字典包含另一个字典,该字典包含一个列表
- vba - 从 Access 自动通过电子邮件发送报告
- shopify - 集合页面中的尺寸变体
- firebase - Android 未捕获 Firestore 事务 PlatformException
- c++ - 有没有办法插入矢量
进入带有 bytea 属性的 postgresql 表,没有 UTF8 编码错误? - magento - 在 Magento 2 发票电子邮件中编辑元素
- python - 如何在python中拆分一串字母两个数字和一个数字?