代码之家  ›  专栏  ›  技术社区  ›  bogen

如何使用函数reactiveSwift从属性中概括表单输入?

  •  2
  • bogen  · 技术社区  · 8 年前

    如果我经常做一些更改,那么在使用我想发送的字段执行表单时

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

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

    获取一个在加载时触发一次的信号,这样当用户点击一个按钮时,我就可以在CombineTest中使用它,这个按钮将向服务器触发一个表单值为的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})
         }
    }
    

    在纸上看起来不错,但会返回字符串??对于给定的示例,和不起作用。

    我也试着把它写成信号的静态函数,但没有成功。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Al___    8 年前

    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()
    })
    
    推荐文章