KVO 不适用于自定义 NSObject 子类的属性
KVO not working for attribute of custom NSObject subclass
我正在编写一个与蓝牙接口的应用程序,出于面向对象的原因,我需要能够在蓝牙事件发生时通知多个对象。我有一个自定义模型对象:
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++
}
}
...
}
以及我正在尝试连接 KVO 的控制器:
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!")
}
...
}
我已经确认计数正在重复递增,即使在视图控制器加载并注册为观察者之后也是如此。我很确定没有触发任何通知,但我不知道为什么。我需要添加一些东西来在自定义 NSObject 中启用 KVO 吗?我正在使用最新的 iOS9 和 Swift2.
确保 count
属性 是使用 dynamic
关键字声明的。如果它不能解决您的问题,请查看 this。
我正在编写一个与蓝牙接口的应用程序,出于面向对象的原因,我需要能够在蓝牙事件发生时通知多个对象。我有一个自定义模型对象:
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++
}
}
...
}
以及我正在尝试连接 KVO 的控制器:
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!")
}
...
}
我已经确认计数正在重复递增,即使在视图控制器加载并注册为观察者之后也是如此。我很确定没有触发任何通知,但我不知道为什么。我需要添加一些东西来在自定义 NSObject 中启用 KVO 吗?我正在使用最新的 iOS9 和 Swift2.
确保 count
属性 是使用 dynamic
关键字声明的。如果它不能解决您的问题,请查看 this。