如何使用函数reactSwift概括属性的表单输入?

时间:2018-09-12 12:00:22

标签: swift functional-programming reactive-programming reactive-swift

当我要发送带有字段的表单时,如果我经常做更改,则要发送

let initialOrChangedName = Signal.merge(
   nameChanged.signal, 
   self.viewDidLoadProperty.signal
       .map { _ in nil }  
   )

其中

private let nameChangedProperty = MutableProperty<String?>(nil)
private let viewDidLoadProperty = MutableProperty(())

获得一个在加载时已触发的信号,因此当用户点击一个按钮时,我可以在CombineLatest中使用该信号,该按钮将向服务器发送具有表单值的Web请求。由于此信号合并,它将提供所有在初始值之后更改的值,这样当用户点击“提交”按钮时,我就可以发送最新值

此用法通常类似于

Signal.combineLatest(intialOrChangedName, initialOrChangedAge)
.sample(on:sendButtonTappedProperty.signal)

如果发送的值为零,我只是不将其包含在Web请求中,但是如果其中一些值已由用户更改,我的确会获得其他值。

由于这是一个相当常见的模式,因此我想将其概括为一个函数,例如

let initialOrChangedName = nameChanged.initialOrChangedState(on: viewDidLoadProperty)

我尝试编写

extension MutableProperty where Value: OptionalProtocol {


     public func initialOrChangedState(on viewDidLoadProperty: MutableProperty<Void>) -> Signal<Value?, Error> {

          return Signal.merge(self.signal.map(Optional.init),
               viewDidLoadProperty.signal.map { _ in nil})
     }
}

在纸上看起来不错,但会返回String?对于给出的示例,不起作用。

我也尝试过将其作为静态函数写在Signal上,但是没有运气。

1 个答案:

答案 0 :(得分:0)

我想应该是这样的:

extension MutableProperty where Value: OptionalProtocol {


         public func initialOrChangedState(on viewDidLoadProperty: MutableProperty<Void>) -> Signal<Value?, Error> {

              return self.signal.map({Optional<Value>($0)}).merge(with: viewDidLoadProperty.signal.map({_ in nil}))
         }
    }

但是,使用viewDidLoadProperty有什么意义呢?实际上,如果您在viewDidLoad()的末尾订阅信号,甚至不需要这样的属性,结果就不需要那个merge()东西,也就不需要扩展MutableProperty协议。

因此,您所需要做的就是:

submitButton.reactive.controlEvents(.touchUpInside).observer(on: UIScheduler()).observeValues({ _ in
   readInputs()
   launchRequest()
})