Как обобщить входные данные формы из свойств, используя функционал реактивныйSwift? - PullRequest
0 голосов
/ 12 сентября 2018

При выполнении форм с полями я хочу отправить, если есть изменение, которое я часто делаю

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

, где

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

, чтобы получить сигнал, который один раз сработал при загрузке,поэтому я могу использовать его в сочетании с последним, когда пользователь нажимает кнопку, которая запускает веб-запрос со значением формы на сервере.Поскольку этот сигнал объединяется, он дает все значения, которые изменяются после исходного значения, что позволяет мне отправлять самое новое значение, когда пользователь нажимает кнопку отправки

. Обычно для этого используется значение, подобное

Signal.combineLatest(intialOrChangedName, initialOrChangedAge)
.sample(on:sendButtonTappedProperty.signal)
* 1011.* если значения отправлены ноль, я просто не включаю их в веб-запрос, но я получаю другие значения, если некоторые из них были изменены пользователем.

Поскольку это довольно распространенный шаблон, я хочу обобщитьэто к одной функции, например

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 ??для данного примера, и не работает.

Я также пытался написать его как статическую функцию для сигнала, но безуспешно.

1 Ответ

0 голосов
/ 12 сентября 2018

Полагаю, это должно быть примерно так:

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()
})
...