【问题标题】:MVVM implementation with RxSwift and Realm - Two way binding使用 RxSwift 和 Realm 实现 MVVM - 两种方式绑定
【发布时间】:2018-04-08 15:22:25
【问题描述】:

我使用 RxSwift、Realm 和 RxRealm 实现的 MVVM 模式如下所示:

例如我有一个显示一些可编辑内容的文本字段。我希望它像这样实时保存/同步到数据库:

//View
textField.rx.text.subscribe(textViewModel.saveText.inputs)
viewModel.stringValue.drive(textField.rx.text)

//ViewModel:
lazy var saveText = Action<String,Void>{ newStringValue in 
   realm.write{
     textObject.stringValue = newStringValue
   }
  //don't block the main thread
  return Observable.just()
}  

lazy var stringValue = Observable(from:textObject).map{$0.stringValue}.asDriver(onErrorJustReturn : "no string")

在 TextField 中缓慢键入时,一切都会相应地工作。当快速打字时,字母会像这样被“吞下”:

  1. 类型“A”
  2. 将“A”写入数据库
  3. 类型“B”
  4. 从 DB 接收“A” -> 文本字段值变为 A 而不是 AB。

使用实时同步时,这是所需的行为。对于单个文本输入,这似乎不是一个好的解决方案。如何正确实现这样的 2-way 绑定并避免不良影响,尤其是在 viewModel 在写入之前或从源读取之后处理文本值的情况下?

【问题讨论】:

    标签: swift mvvm data-binding realm rx-swift


    【解决方案1】:

    根据您的要求,Realm 存储的数据是否会通过其他来源进行更新?比如,你能在字符串中收到来自另一个字段的值吗?

    如果不是,那么您也许可以相信您的输入,并且您的写入最终会保持一致。

    不过,问题归结为写入速度和返回数据的通知;小但不是什么都没有。也许中介会是有益的。

    例如,将您的输入字段写入将定期同步到 Realm 的值。这样,您的 observable 可以立即访问更新的值,并且您可以相信最终该值将是

    很高兴进一步探索,看看我们是否能解决问题。 :)

    编辑:

    Realm 对conflict resolution 的指导。

    手动方法可能是保存两个值;一个是您开始时的值,另一个是服务器正在管理的值。

    如果起始值和服务器值不同,则需要管理冲突。您的策略可以是拒绝、接受或以某种方式合并它们,具体取决于数据的复杂性。

    【讨论】:

    • 数据也可以来自其他用户通过领域对象服务器 - 也来自其他来源但不是同时的(除了 ROS)。我也考虑过一个中间层,但那是一个额外的层——是否有适合 MVVM 的良好设计模式?它是在 Viewmodel 中还是我必须将我的 Realm 模型包装到 Object 控制器或类似的东西中。
    • @hakkurishian realm.io/docs/realm-object-server/latest/#conflict-resolution 对解决冲突有一些指导。
    • 我明白了解决冲突的要点——但我的问题与当前我的模型和 ViewModel 之间的这种客户端中间层的数据流/架构有关,它考虑了来自的值领域和来自文本字段的值。当订阅模型并限制写入时,我会知道更改是来自客户端还是来自服务器将“最后一个编辑器”存储在数据库中是否明智?在每次写入时只订阅不是来自“我”作者的值吗?
    • 你有没有想到任何方法,我也有同样的问题。如果是,请告诉我,我正在考虑每当更新 UI 并在后台将数据保存在领域数据库中时执行此更新非领域模型的最佳方法。像旧方法一样。关于服务器更新需要在服务器更新时验证非领域模型和领域模型。
    猜你喜欢
    • 2017-05-28
    • 2017-09-05
    • 2016-09-26
    • 1970-01-01
    • 2020-05-08
    • 2021-03-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多