ios - Rxswift 当事件发生时取消观察者并重新订阅

标签 ios swift observable rx-swift

嗨,任何人都知道如何在事件发生时取消可观察并重新订阅(基本上我希望可观察在另一个事件发生时跳过发射(点击取消按钮)

详细场景:在 UISearchBar 上点击“取消”按钮,如何在点击“取消”按钮时使可观察对象暂停并停止发出事件?

我正在考虑这样的事情:

Observable.of(searchClick,historyClick).merge().debounce(0.3, scheduler: scheduler)
                    .takeUntil(searchBar.rx.cancelButtonClicked)
                    .bind(to: viewModel.search)
                    .disposed(by: disposeBag)

但是订阅之后就停止了。当事件发生时,我们如何重新订阅或以任何其他方式跳过发射?

最佳答案

我认为最好使用“.switchLatest()”运算符切换到下一个可观察对象(在切换时可能处于休眠状态)。

let eventSwitch: BehaviorSubject<Observable<T>> = BehaviorSubject.create(/*initial value*/) // where T is your type of choice
let events = eventSwitch.switchLatest() // subscribe consumer to this
eventSwitch.onNext(/*new event source of type Observable<T>*/) // call this from "Cancel" button

更新

let eventSwitch = BehaviorSubject(value: Observable
    .of(searchClick,historyClick)
    .merge()
    .debounce(0.3, scheduler: scheduler)
  )
let events = eventSwitch.switchLatest()

events
  .bind(to: viewModel.search)
  .disposed(by: disposeBag)

// call this from "Cancel" button
eventSwitch.onNext(...)
// argument can be empty observable or 'Observable.of(searchClick,historyClick).merge().debounce(0.3, scheduler: scheduler)'

关于ios - Rxswift 当事件发生时取消观察者并重新订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52697578/

相关文章:

ios - 首次加载到 Swift 中的 UICollectionView 时,视差效果略显不稳定

ios - Xcode 错误 : Abort trap 6 (only show in device)

ios - 在 Swift 3 中使用 SnapKit 以编程方式修改约束以删除一个 UIView

ios - UICollectionReusableView 内部的标签始终为零

flutter - 在 RxDart 中用什么代替 "combineLatest2"?

ios - 如何访问扩展类中自定义单元格的文本字段?

ios - 在 iOS 中访问本地存储的(对用户隐藏,在库下)文件

ios - iOS 7 中的屏幕截图

angular - TS 可观察 & ng : proper templating syntax

knockout.js - knockout observableArray 推送 - 不推送到数组