【发布时间】:2020-04-01 14:21:50
【问题描述】:
我创建了一个小项目来测试 Bluetooth 使用 CoreBluetooth framework。在我的viewController 中,它可以像这样正常工作:
class ViewController: UIViewController {
var myCentral: CBCentralManager! = nil
override func viewDidLoad() {
super.viewDidLoad()
myCentral = CBCentralManager(delegate: self, queue: nil)
}
}
extension ViewController: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(withServices: nil, options: nil)
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
if let name = peripheral.name {
print(name)
}
}
}
但是,我想将 Bluetooth 的东西移动到另一个 class 并从 viewController 运行它。那可能吗?我的尝试不起作用:
在新的class 中,移动了Bluetooth 的东西:
class BLEhandler: NSObject {
var centralManager: CBCentralManager!
}
extension BLEhandler: CBCentralManagerDelegate {
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(withServices: nil, options: nil)
}
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
if let name = peripheral.name {
print(name)
}
print(peripheral.name)
}
}
并从viewController 调用它:
override func viewDidLoad() {
super.viewDidLoad()
var centralManager = BLEhandler().centralManager
centralManager = CBCentralManager(delegate: self, queue: nil)
}
现在它只显示一个小的log:
[CoreBluetooth] XPC 连接无效
我怀疑我可以像这样使用delegates,我认为解决方案与协议有关,但我不确定。您将如何将delegates 转移到其他classes 并仍然让他们工作?
【问题讨论】:
-
也许当 viewDidLoad 退出时你的 BLEHandler 正在被释放。让它成为你的 viewController 的一个属性来保留它。
-
@FryAnEgg 你能详细说明一下吗?不太确定我明白你的意思:)
-
看起来你想通了。干杯!
标签: ios swift delegates core-bluetooth