[英]ReactiveCocoa subscribe block not called on viewModel in Swift
我正在使用MVVM和ReactiveCocoa構建應用程序來在viewModel和UI之間進行綁定,但是不會調用視圖模型驗證信號訂閱塊。
我的視圖模型非常簡單和准確:
class ViewModel: RVMViewModel {
var name: String = "" {
willSet {
println("New Value: \(newValue)")
}
}
required init(){
super.init()
let signal = self.rac_valuesForKeyPath("name", observer: self)
signal.subscribeNext {
println("Subscribe block: \($0)")
}
}
}
在我的視圖控制器中,我有以下綁定:
//observe ui and programatic changes
RACSignal.merge([self.nameField.racTextSignal(), self.nameField.rac_valuesForKeyPath("text", observer:self)]).subscribeNext({
(next) -> Void in
if let text = next as? String {
self.viewModel.name = text
}
})
RAC(self.nameField, "text") = self.viewModel.rac_valuesForKeyPath("name", observer: self)
我根據我在這里閱讀的內容,讓RAC宏在swift中工作。
現在,在我的視圖控制器中的視圖綁定中,subscribeNext塊被調用就好了。 在我的viewModel中,在willSet中打印出新值。 但是,當初始化屬性時,我的init塊中的信號上的訂閱塊僅被調用一次。 這讓我起了牆,任何人有什么想法?
經過一系列的實驗,我找到了解決方案。 通過將信號直接分配給視圖模型屬性,每次值更改時都會調用subscribe塊。
所以不要這樣做:
RACSignal.merge([self.nameField.racTextSignal(), self.nameField.rac_valuesForKeyPath("text", observer:self)]).subscribeNext({
(next) -> Void in
if let text = next as? String {
self.viewModel.name = text
}
})
我這樣做了:
RAC(self.viewModel, "name") <~ RACSignal.merge([self.nameField.racTextSignal(),
self.nameField.rac_valuesForKeyPath("text", observer:self)])
我用這個鏈接來獲取RAC
和<~
在swift中工作。
我還沒有解決方案 - 我離筆記本電腦一直到晚上。 但是,嘗試在全局范圍或實例變量中發出信號...如果這不起作用,請嘗試將單例作為您明確調用的方法...這些是更多的測試,但如果你告訴我它是怎么回事可以一起解決。
比接受的解決方案更好的解決方案是簡單地標記屬性動態:
dynamic var name: String = "" {
willSet {
println("New Value: \(newValue)")
}
}
這使得Obj-C級別KVO通常僅對僅Swift屬性禁用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.