代码之家  ›  专栏  ›  技术社区  ›  Göktuğ Aral

RxSwift订阅内部完成块发行

  •  1
  • Göktuğ Aral  · 技术社区  · 7 年前

    我有一个特别的问题。我通常都有这个,但我不知道为什么。

    但我发现了一些东西;呼叫计数的增加取决于另一个订阅。

    例如;我有两个组件,在viewController上声明。一个是自定义集合视图,另一个是自定义刷新控制管理器。

    self.kpiesCollectionView.collectionHeaderButton.rx.tap
        . subscribe(onNext: { [weak self] _ in
               // Push to next ViewController
           }).disposed(by: self.kpiesCollectionView.disposeBag)
    
    
    refreshControl.rx.controlEvent(UIControlEvents.valueChanged).asObservable().subscribe(onNext: { () in
                DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
                    completion()
                }
            }).disposed(by: disposeBag)
    

    刷新控制工作自行处理。它只是将完成返回到viewController。所以我自己叫disposeBag。

    情况是这样的;

    单击按钮->推送至VC(1次)


    单击按钮->推送至VC(2次)

    拉动以刷新
    单击按钮->推送至VC(3次)

    更新

    self.kpiesCollectionView.collectionHeaderButton.rx.tap.subscribe( 在我的请求完成块内,但当我移到它之外时,它工作得很好。

    也许这不是正确的地方,但是,只是想学习。我怎样才能避免这种情况。?即使在块内,我如何调用subscribe()?

    1 回复  |  直到 5 年前
        1
  •  1
  •   danypata    7 年前

    我决定在这里发布一个答案,也许其他用户会觉得它很有用。所以如果你的密码 subscribe:onNext 多次调用而没有 onNext 命令已由观察者发送,这意味着您多次订阅了观察者。

    dispose(bag:) 当释放dispose包时,将释放任何订阅服务器,但如果该包仍然存在于对象上,则不会释放订阅服务器,此外,对于UI订阅服务器(在视图控制器、视图等中),最好使用 week self 内部 onNext:/onError/etc

    要“强制”处理袋子,有三种选择:

    • 如果你使用 DisposeBag 这就足够重新初始化这个包了( bag = DisposeBag() ).
    • CompositeDisposable 这就像一本字典,这种袋子给你一个更精确的控制什么你可以处置,每当你添加一个处置袋( bag.insert ,你会得到一个一次性的钥匙,你可以打电话 remove
    • 最后一个选项,有时更像丑陋的选项,是保留对一次性的引用并直接调用dispose,例如:

      var myDisposable: Disposable? = nil
      
      ......
      fun iWantToSubscribe() {
          myDispsable?.dispose()
          myDisposable = myObserver.subscribe(onNext: {})
      }
      
    推荐文章