Objective c KVO或如何在Swift中从外部侦听属性更改
我有一个具有属性的实例,我想侦听来自其他实例的更新 例如,类菜单有一个属性badgeCount,我想监听badgeCount的任何更新,例如当badgeCount更改时。我希望我的ViewController在修改badgeCount以了解实际数据后进行回调Objective c KVO或如何在Swift中从外部侦听属性更改,objective-c,swift,swift2,key-value-observing,Objective C,Swift,Swift2,Key Value Observing,我有一个具有属性的实例,我想侦听来自其他实例的更新 例如,类菜单有一个属性badgeCount,我想监听badgeCount的任何更新,例如当badgeCount更改时。我希望我的ViewController在修改badgeCount以了解实际数据后进行回调 目标是我可以用于列出的属性的KVO,如何在Swift中使用KVO。我是Swift新手。如果您想在Swift中使用KVO,有两个要求: 要对其执行KVO的类必须继承自NSObject(或任何NSObject子类) 您需要观察的属性必须标记为
目标是我可以用于列出的属性的KVO,如何在Swift中使用KVO。我是Swift新手。如果您想在Swift中使用KVO,有两个要求:
- 要对其执行KVO的类必须继承自NSObject(或任何NSObject子类)
- 您需要观察的属性必须标记为
dynamic
class Menu: NSObject {
dynamic var badgeCount: Int = 0
}
然后,您可以使用常用的menuInstance.addObserver(self,forKeyPath:“badgeCount”,选项:NSKeyValueObservingOptions(),上下文:nil)
但这个解决方案不是很快
更好的解决方案包括(不是详尽的列表): 使用swift的
didSet/willSet
调用一些回调函数
class Menu {
var badgeCount: Int = 0 {
didSet {
badgeCountChangedListener(badgeCount)
}
}
init(badgeCountChangedListener: (Int -> Void)) {
self.badgeCountChangedListener = badgeCountChangedListener
}
private let badgeCountChangedListener: (Int -> Void)
}
使用变量
类型
class Menu {
let badgeCount = Variable(0)
}
// and from where you observe
menuInstance.badgeCount.subscribeNext { badgeCount in
print(badgeCount)
}
您也可以使用KVO,但必须使用NSObject等。相反,我建议您使用通知或推出自己的变更观察机制。这两种选择都很好,取决于具体情况,你可能更喜欢其中一种。看看Bond框架,它们有一种可观察的类型可能会帮助你:谢谢,但似乎我不能添加menuInstance.addObserver,甚至没有名为addObserveras的方法,如回答>中所述,您要在其上执行KVO的类必须从NSObject继承