Как я могу заставить делегатов CoreBluetooth работать после перемещения их в отдельный класс? - PullRequest
0 голосов
/ 01 апреля 2020

Я создал небольшой проект для проверки 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] XP C недопустимое соединение

Я сомневаюсь, что смогу использовать delegates вот так, и я думаю, что решение как-то связано с протоколами, но я не уверен. Как бы вы go перешли с delegates на другие classes и все же заставили бы их работать?

1 Ответ

1 голос
/ 02 апреля 2020

Хорошо, заставьте его работать, просто объявив его сначала в ViewController:

var centralManager: BLEhandler!

, затем в viewDidLoad I initialized it:

centralManager = BLEhandler()

вместо непосредственно initializing это в viewDidLoad.

...