ios - iOS:获取 API 误用:取消未使用外围设备的连接
问题描述
我有一个持有CBPeripheral
数组的单例类。发现新设备时,会将其添加到该阵列中。该数组用作UITableView
数据源。CBPeripheral
当用户选择表格视图单元格时,将通过 fetch连接到选定的单元格。
不幸的是,我收到了这个错误:
[CoreBluetooth] API MISUSE:取消未使用外围设备的连接
<CBPeripheral: 0x1c0103e70, identifier = xxx, name = xxx, state = connecting>
,您是否忘记保留对它的引用?
我搜索了堆栈溢出,之前也有人问过类似的问题,但他们都说根本原因是“没有将外围设备添加到强引用,所以iOS释放它”。但我已将它们添加到数组中。
代码:
class BLEManager:NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {
static let sharedInstance = BLEManager()
var centralManager: CBCentralManager!
var connectedService: BLEDSPService?
var delegate: BLEDiscoveryDelegate?
var readUUIDString: String
var writeUUIDString: String
var serviceUUIDString: String
var connectedPeripheral: CBPeripheral?
var peripherals = [CBPeripheral]() {
didSet {
delegate?.peripheralDidDiscoverNewOnes()
}
}
init(serviceUUIDString: String, readUUIDString: String, writeUUIDString: String) {
self.readUUIDString = readUUIDString
self.writeUUIDString = writeUUIDString
self.serviceUUIDString = serviceUUIDString
super.init()
centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main);
}
internal func startScanning() {
let serviceUUID = CBUUID(string: serviceUUIDString)
let options = [CBCentralManagerScanOptionAllowDuplicatesKey: 0]
centralManager.scanForPeripherals(withServices: [serviceUUID], options: options)
}
func stopScanning() {
centralManager.stopScan()
delegate?.peripheralDidStopScan()
}
open func connectTo(index: Int) {
if let current = connectedPeripheral {
disconnectPeripheral(current)
}
if index < peripherals.count {
connectPeripheral(peripherals[index])
stopScan()
}
}
@objc func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
guard let name = peripheral.name?.lowercased() else {
return
}
guard (name.contains(NamesManager.shared.scanName)) else {
return
}
if !peripherals.contains(peripheral) {
peripherals.append(peripheral)
delegate?.peripheralDidDiscovered()
}
}
但是,如果我将外围设备保存到 var,然后连接它。有用:
var connectedPeripheral: CBPeripheral?
open func connectTo(index: Int) {
if let current = connectedPeripheral {
connectPeripheral(current)
}
stopScan()
}
@objc func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
guard let name = peripheral.name?.lowercased() else {
return
}
guard (name.contains(NamesManager.shared.scanName)) else {
return
}
if !peripherals.contains(peripheral) {
connectedPeripheral = peripheral
peripherals.append(peripheral)
stopScanning()
delegate?.peripheralDidDiscovered()
}
}
解决方案
推荐阅读
- vue.js - 我需要为生产模式禁用 Vue.js devtools,但应该为开发模式启用它
- json - 如何使用基于 Django 中的列的键查询 JSONField
- python - 如何绘制二维直方图,颜色条显示 Python 中第三个变量的 bin 中的平均值?
- javascript - 使用分配给 const 的函数
- python - 将代码中的输出图像保存到系统中,而无需在 python 中截屏
- amazon-web-services - 使用 AWS Lambda 在现有 EMR 集群中运行和检查 Spark 作业的状态
- swiper - 重复的幻灯片行为不正确
- reactjs - I am trying to use TinyMCE with dynamically generated textareas, but the IDs are always set by something else
- reactjs - 样式化组件属性分配中的以下代码有什么区别?
- google-classroom - 通过 PHP 的 Google Classroom API - 缺少某些课程