Я пишу приложение, которое взаимодействует с Bluetooth, и по причинам OO мне нужно иметь возможность уведомлять 1 обо всех объектах, когда происходят события Bluetooth. У меня есть пользовательский объект Model:KVO не работает для атрибута пользовательского подкласса NSObject
class BluetoothModel: NSObject, CBCentralManagerDelegate {
var cBCentralManager: CBCentralManager!
var peripherals = [CBPeripheral]()
var count = 0
// MARK: - Singleton Definition
static let instance = BluetoothModel()
private override init() {
super.init()
cBCentralManager = CBCentralManager(delegate: self, queue: dispatch_get_global_queue(QOS_CLASS_UTILITY, 0))
}
// MARK: - CBCentralManagerDelegate
func centralManagerDidUpdateState(central: CBCentralManager) {
cBCentralManager.scanForPeripheralsWithServices(nil, options: nil)
}
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
if !peripherals.contains(peripheral) {
peripherals.append(peripheral)
count++
}
}
...
}
Как также контроллер, который я пытаюсь подключить с КВО:
class MasterViewController: UITableViewController, CBCentralManagerDelegate {
...
override func viewDidLoad() {
super.viewDidLoad()
...
BluetoothModel.instance.addObserver(self, forKeyPath: "count", options: .New, context: nil)
}
...
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
print("Change!")
}
...
}
Я подтвердил, что счетчик инкрементируется неоднократно, даже после того как контроллер представления загружает и регистрирует в качестве наблюдателя. Я почти уверен, что никаких уведомлений нет, но я не знаю, почему. Нужно ли добавлять что-то, чтобы включить KVO в пользовательский NSObject? Я использую последние iOS9 и Swift2.
Whoa! Ну, вот и все. Спасибо! Я не могу поверить, что этот «динамический» не появился в моих Google-играх в KVO. До сих пор я не узнал об этом даже при тщательном обучении, которое я выполнял. Я не могу пометить ваш ответ как решение, но спасибо.^ –
Принимая мой ответ, мы будем очень благодарны :) Коды удачи, человек :) –