如何使用Bond双向绑定来清理数据

时间:2018-04-01 17:45:24

标签: ios swift frp reactivekit

我对FRP很陌生,决定开始使用Bond和ReactiveKit,因为它看起来很轻巧,可以逐渐将它应用到我的应用程序和我的头上。

我有一个设置,我有一个视图,它有一个可观察的State,我有一个视图模型与另一个State类型的可观察属性。我希望我的视图枯燥乏味并且不知道语义,所以我希望我的视图模型验证状态,转换它并发送回视图。

该视图包含几个文本字段和一个分段控件。当分段控件为0时,我只希望第一个文本字段可见,否则 - 两个字段。每当用户输入内容或点击分段控件时,都会更新可观察状态对象。这是State结构:

enum ValueType {
    case text
    case number
}

struct State {
    var name: String?
    var unit: String?
    var valueType: ValueType = .text
    var showsUnitTextField: Bool = true
}

这是我能想到的最好的:

查看型号:

override init() {
    super.init()
    self.bind()
}

let inputState: Observable<State> = Observable<State>(State())

var outputState: Observable<State> = Observable<State>(State())

private func bind() {
    inputState.map(self.sanitizeState(_:)).bind(to: outputState)
}

private func sanitizeState(_ state: State) -> State {
    var newState = state
    newState.showsUnitTextField = state.valueType == .number
    return newState
}

查看控制器:

private func bind() {
    myView.reactive.state.bind(to: viewModel.inputState)
    viewModel.outputState.bind(to: myView.reactive.state)
}

基本上我有两个observable,一个接收更新,另一个将转换后的值发送回视图。这个解决方案似乎引入了沉重的样板,我正在寻找一个更好的解决方案。有没有人有任何想法?

P.S。其他可能派上用场的情况是我想对用户输入有一些约束(只有字母或只有数字),或者我想以一种奇特的方式格式化输入。

0 个答案:

没有答案