微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AVCaptureSession stopRunning() 神秘崩溃

如何解决AVCaptureSession stopRunning() 神秘崩溃

最近我收到了有关 Firebase 崩溃的通知,这是消息:

[AVCaptureSession stopRunning] stopRunning may not be called between calls to beginConfiguration and commitConfiguration 

我检查了我的代码,最奇怪的部分是我从不打电话,也没有提到 beginConfiguration()commitConfiguration()

在我的 CameraManager 类中,这是触发崩溃的函数,它在 deinit 上调用

  func stop() {
    guard isstarted else { return Log.w("CameraManager wasn't started") }
    queue.async {
        self.isstarted = false
        self.isCapturingFrame = false
        self.isCapturingCode = false
        self.session?.stopRunning()
        self.session = nil
        self.device = nil
    }
    notificationCenter.removeObserver(self,name: UIApplication.didBecomeActiveNotification,object: nil)
    layer.removeFromSuperlayer()
    layer.session = nil
}

queue 只是一个串行调度队列。 无论我尝试什么,我都无法重现这次崩溃。 尝试拉菜单,推送通知,电话,模拟内存警告等...... 澄清一下,我的代码中没有一个地方调用 beginConfigurationcommitConfiguration

解决方法

我可以想象 layer.session = nil 将导致捕获会话的重新配置(因为与预览层的连接已被删除)。由于您正在调用 stopRunning() 异步,我想您可能会遇到竞争条件,其中 stopRunning() 在配置更改的中间被调用。

我建议您尝试使清理调用同步 (queue.sync { ... }) 或将层清理也移到 async 块中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。