簡體   English   中英

在Swift中的viewModel上沒有調用ReactiveCocoa訂閱塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM