我创建了一个小项目,使用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
并仍然使它们工作?
[好吧,只需在ViewController
中先声明一下即可使其生效:
var centralManager: BLEhandler!
然后在viewDidLoad
我initialized
中:
centralManager = BLEhandler()
而不是直接在initializing
中将其viewDidLoad
。