使用ReactiveCocoa 4将信号从视图传递到MVVM中的模型

时间:2015-11-02 12:05:21

标签: ios swift mvvm reactive-cocoa

我在尽可能基本的iOS应用程序(Swift)中实现ReactiveCocoa 4,以便更好地了解如何将其与MVVM架构一起使用。我的问题是:如何从视图到模型获取UITextField的textSignal?

我在这里的作品有效,但感觉这只有50%被动(在任何情况下都不太漂亮):

VIEW(在viewDidLoad中)

originalTextField.rac_textSignal().subscribeNext{
    (next:AnyObject!) -> () in
    let text = next as! String
    self.viewModel?.originalText=text
}

查看模型

var originalText:String?{
    didSet{self.model.originalText=originalText}
}

MODEL

var originalText:String?{
    didSet{//Do model stuff}
}

1 个答案:

答案 0 :(得分:0)

这就是我目前实现这种行为的方式,我对RAC也是一个新手,所以要把它当作一粒盐。

我正在使用ReactiveCocoa 4.1.0 & Rex 0.10.0

<强>视图模型

  1. MutableProperty
  2. 设置originalText

    可变属性具有producer属性,您将从视图中绑定该属性。

    使用该绑定,调用originalText.producer.startWithNext将创建一个Signal并添加1个观察者,这样您就可以从ViewModel中接收值

        let originalText: MutableProperty<String> = MutableProperty("")
    
        func observeTextField(){
            originalText.producer.startWithNext { (str) in
                self.model.originalText = str
            }
        }
    

    查看

    添加Rex作为依赖项并导入它。您将使用Rex中的ignoreError来处理类型冲突。

    SignalProducer定义为SignalProducer<T, ErrorType>,因此您必须放弃ErrorType以匹配您的MutableProperty<String>

    1. 从文本字段
    2. 创建信号生成器
    3. 忽略信号生成器上的错误
    4. 将信号生成器绑定到ViewModel的MutableProperty
    5. 从第3步绑定后的视图中调用ViewModel.observeTextField
    6. 中缀<~运算符将生成器绑定到ViewModel的MutableProperty

          import Rex
      

      ...

          let textFieldProducer = (originalTextField.rac_textSignal()
              .toSignalProducer()
              .map {text in text as! String}
              .ignoreError())!
      
          viewModelInstance.originalText <~ textFieldProducer
      

      我希望这会对你有所帮助。