繁体   English   中英

iOS 11 CoreBluetooth:无法删除关键路径“委托”的观察者CBPeripheral

[英]iOS 11 CoreBluetooth: Cannot remove an observer CBPeripheral for the key path “delegate”

自从iOS 11发布以来,我遇到了一个过度但经常崩溃的问题,其中包括以下签名:

Cannot remove an observer <CBPeripheral 0x1c010ef10> for the key path "delegate" from <CBPeripheral 0x1c010ef10> because it is not registered as an observer.

这种情况发生在蓝牙设备的扫描环境中,后来与其中一个设备的连接以及整个过程的最终清理。 所有这些任务都在非主调度队列中执行,以缓解主线程上的压力(以获得更流畅的UI体验)。 自从iOS 9天以来,这个代码一直在运行,并且只是现在iOS 11出现了,开始崩溃。

到目前为止,我在网络中找到的关于此行为的唯一参考是这个以及Estimote SDK的 这篇文章。 这些引用表明在不同的调度队列中可能会出现CBCentralManager的并行实例,但是,官方编程指南中没有说明有关此事的特殊注意事项。 此外, Apple工作人员另一个 CoreBluetooth问题的回复说明:

对于没有对CB对象进行适当引用的应用程序,iOS 11通常会不那么宽容......

听起来不是很鼓舞人心。 我尝试使用XCode和它的配套工具来分析应用程序并寻找潜在的泄漏,但这也没有给它带来太多启发。

有没有其他人遇到过类似的问题? 关于如何解决它的任何建议? 关于下一步挖掘的想法?

在一段测试期之后,在我们的特定情况下,解决方案包括将所有与蓝牙堆栈相关的工作转换为mainQueue 这意味着所有相关的回调都存在于主线程区域内。

这个解决方案在这些回调中执行的工作需要格外小心(UI也在这里运行),但由于大多数CoreBluetooth操作默认是异步的,所以这已证明是可行的。 此解决方法已在iOS 11中得到确认,到目前为止,iOS 12中也未报告任何问题。

这里要说的是: 处理mainQueue中绝对必要的位,然后在必要时将其余的负载转移到其他位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM