2017-01-15 2 views
1

Я начинаю использовать Bond для реализации базового шаблона MVVM в приложении и иметь сценарий, в котором я хотел бы временно приостановить наблюдение за событиями на Observable (через флаг).Bond/ReactiveKit - временно приостановить наблюдения и снова начать наблюдение (но просмотреть события, которые были упущены)

Я бы хотел возобновить наблюдение за событиями, но также хочу «повторить/отправить» события моим наблюдателям, которые, возможно, были пропущены во время периода приостановки.

Я нашел функцию pausable(by:) на Observable, которая хорошо работает для временного приостановления наблюдения за событиями, но я не уверен, как «переигрывать/повторять» любые события после повторного включения наблюдения.

урезанный пример того, что я пытаюсь сделать это: -

  • Изначально установлено значение viewModel.message быть «Original Value»
  • На viewDidLoad связывают viewModel.message к тексту label, но позвольте ему быть правдоподобным.
  • На пользовательском интерфейсе есть кнопки, которые будут
    • Измените значение сообщения (changeMessageButton)
    • остановить обновление текста метки (stopChangingLabelTextButton)
    • начать обновление текста метки снова (startChangingLabelTextButton)

Код: -

class MyViewController: UIViewController { 
    let viewModel = MyViewModel() 
    let shouldUpdate = Observable(true) 

    @IBOutlet weak var label: UILabel! 

    @IBOutlet weak var changeMessageButton: UIButton! 
    @IBOutlet weak var stopChangingLabelTextButton: UIButton! 
    @IBOutlet weak var startChangingLabelTextButton: UIButton! 

    override func viewDidLoad() { 
     viewModel.message.pausable(by: shouldUpdate).bind(to: label.bnd_text) 

     changeMessageButton.bnd_tap.observe { _ in 
      viewModel.message.value = "Changing Message" 
     } 

     stopChangingLabelTextButton.bnd_tap.observe { _ in 
      shouldUpdate.value = false 
     } 

     startChangingLabelTextButton.bnd_tap.observe { _ in 
      shouldUpdate.value = true 
      // DO SOMETHING TO BE ABLE TO "REPLAY/RESEND" ANY EVENTS TO viewmodel.message 
     } 
    } 
} 

class MyViewModel { 
    let message = Observable<String>("Original Value") 
} 

Что было бы лучшим способом справиться с этим?

ответ

0

Да, pausable будет игнорировать и опускать события во время приостановленного состояния. Если вы нормально с переигрывая только последнее значение, вы могли бы плоско карту shouldUpdate так:

shouldUpdate.flatMapLatest { shouldUpdate -> SafeSignal<String> in 
    if shouldUpdate { 
     return viewModel.message.toSignal() 
    } else { 
     return .never() 
    } 
}.bind(to: label.bnd_text) 

Всякий раз, когда shouldUpdate генерирует событие, оно будет либо начать распространяющихся viewModel.message или ничего. Всякий раз, когда он начинает распространяться viewModel.message, он также получит последнее значение, поскольку Observable всегда повторяет ласты для новых наблюдателей.

Пожалуйста, убедитесь, что вы сделали import ReactiveKit.

+0

Спасибо за указатель - это именно то, что я искал! –

Смежные вопросы