我有一個屬性的實例,我想要偵聽來自其他實例的更新。KVO或如何聆聽從Swift外部的屬性更改
例如class Menu有一個屬性badgeCount,我想監聽badgeCount的任何更新,例如當badgeCount更改時。我希望我的ViewController在修改badgeCount以獲取實際數據後進行回調。
目標是KVO,我可以使用上市的財產,我怎麼可以在Swift中使用KVO。我是Swift新手。
我有一個屬性的實例,我想要偵聽來自其他實例的更新。KVO或如何聆聽從Swift外部的屬性更改
例如class Menu有一個屬性badgeCount,我想監聽badgeCount的任何更新,例如當badgeCount更改時。我希望我的ViewController在修改badgeCount以獲取實際數據後進行回調。
目標是KVO,我可以使用上市的財產,我怎麼可以在Swift中使用KVO。我是Swift新手。
如果你想迅速使用KVO,有兩個要求:
dynamic
一個代碼的例子是:
class Menu: NSObject {
dynamic var badgeCount: Int = 0
}
然後,你可以使用通常的menuInstance.addObserver(self, forKeyPath: "badgeCount", options: NSKeyValueObservingOptions(), context: nil)
但是這個解決方案不是很多swifty。
更好的解決方案是(不是一個詳盡的列表):
使用SWIFT的didSet/willSet
調用一些回調
class Menu {
var badgeCount: Int = 0 {
didSet {
badgeCountChangedListener(badgeCount)
}
}
init(badgeCountChangedListener: (Int -> Void)) {
self.badgeCountChangedListener = badgeCountChangedListener
}
private let badgeCountChangedListener: (Int -> Void)
}
使用RxSwift'sVariable
型
class Menu {
let badgeCount = Variable(0)
}
// and from where you observe
menuInstance.badgeCount.subscribeNext { badgeCount in
print(badgeCount)
}
謝謝,但似乎我不能添加menuInstance.addObserver,甚至沒有方法實例名爲addObserver –
,如答案中所述>您要做KVO的類必須從NSObject繼承 – boundsj
您可以使用志願太,但你必須使用NSObject等。相反,我建議你使用通知或推出自己的更改觀察機制。這兩種選擇都很好,根據情況你可能會比另一個更喜歡。 – Andy
看看邦德框架,他們有一個可以幫助你的Observable類型:https://github.com/SwiftBond/Bond – totiG