ios - 使用 ReactiveCocoa 4 在 MVVM 中将信号从 View 传递到模型

标签 ios swift mvvm reactive-cocoa

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

我在这里得到的是有效的,但感觉这只是 50% 的 react (而且在任何情况下都不太漂亮):

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}
}

模型

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

最佳答案

这就是我目前实现此行为的方式,我也是 RAC 的新手,所以对它持保留态度。

我正在使用 ReactiveCocoa 4.1.0 & Rex 0.10.0


View 模型:

  1. 设置 MutableProperty对于 originalText

可变属性有一个 producer您将从 View 中绑定(bind)到的属性。

有了那个界限,调用originalText.producer.startWithNext将创建一个 Signal 并添加 1 个观察者,这样您就可以从 ViewModel 中接收值

    let originalText: MutableProperty<String> = MutableProperty("")

    func observeTextField(){
        originalText.producer.startWithNext { (str) in
            self.model.originalText = str
        }
    }

查看:

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

SignalProducer定义为 SignalProducer<T, ErrorType>所以你必须删除 ErrorType匹配您的 MutableProperty<String> .

  1. 从文本字段创建信号生成器
  2. 忽略信号生成器上的错误
  3. 将信号生成器绑定(bind)到您的 ViewModel 的 MutableProperty
  4. 调用ViewModel.observeTextField从第 3 步绑定(bind)后的 View

中缀 <~运算符将生产者绑定(bind)到您的 ViewModel 的 MutableProperty

    import Rex

...

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

    viewModelInstance.originalText <~ textFieldProducer

希望对你有帮助

关于ios - 使用 ReactiveCocoa 4 在 MVVM 中将信号从 View 传递到模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33477201/

相关文章:

Swift 3 从 Firebase 获取用户数据

MVVM 和存储库问题

c# - 更新组合框MVVM(XAML和C#)

c# - WPF:MVP 与 MVVM

android - 创建 QR 码以在 iPhone 和 Android 上发送电子邮件

ios - 在表格 View 中选择多个对象

ios - session 身份验证 token Swift

ios - 错误 Nil 与预期的参数类型不兼容 '() -> Void'

ios - 无法在 iOS 应用程序中通过谷歌正确转换视频

ios - 如何在Swift 5中检查3个变量是否彼此相等?