gpt4 book ai didi

ios - 完成 block 问题内的 RxSwift 订阅

转载 作者:行者123 更新时间:2023-11-28 05:52:24 30 4
gpt4 key购买 nike

我有一个真正的具体问题。我经常遇到这个问题,但找不到原因。

主要问题,即使我使用 disposeBag 多次调用“subscribe(onNext :”)。但是我发现了一些东西;调用次数线性增加取决于另一个订阅。

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

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)

refreshControl 工作在自己处理。它只是将完成返回给 viewController。所以我自己调用了 disposeBag。

场景是这样的;

Click Button -> Pushes to VC (1 time)

Pull-To-Refresh
Click Button -> Pushes to VC (2 time)

Pull-To-Refresh
Click Button -> Pushes to VC (3 time)

已更新

我发现了问题。这就是为什么,我也更新了标题。原因是我正在使用 self.kpiesCollectionView.collectionHeaderButton.rx.tap.subscribe(在我的请求完成 block 内,但当我移到它外面时,它运行良好。

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

最佳答案

我决定在这里发布一个答案,也许其他 SO 用户会发现它有帮助。因此,如果您在 subscribe:onNext 中的代码在观察者未发送 onNext 命令的情况下被多次调用,这意味着您已多次订阅观察者。

现在 dispose(bag:) 将在释放包时释放任何订阅者,但如果包仍然存在于您的对象上,订阅者将不会被释放,此外,如果UI 订阅者(在 View Controller 、 View 等中)最好在 onNext:/onError/etc 中使用 week self 以避免包的保留周期/ Controller 。

要“强制”处理一个包,您有以下三种选择:

  • 如果您使用 DisposeBag,重新初始化包就足够了 (bag = DisposeBag())。
  • 有一个像字典一样工作的 CompositeDisposable,只要您在包中添加一次性元素(bag. insert,您将获得该一次性元素的 key ,您可以使用该 key 调用 remove
  • 最后一个选项,有时更像是丑陋的选项,是保留对一次性对象的引用并直接在其上调用 dispose,例如:

    var myDisposable: Disposable? = nil

    ......
    fun iWantToSubscribe() {
    myDispsable?.dispose()
    myDisposable = myObserver.subscribe(onNext: {})
    }

关于ios - 完成 block 问题内的 RxSwift 订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52474940/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com