在 RxSwift 中订阅 Observable 或 Driver 花费的时间太长

Posted

技术标签:

【中文标题】在 RxSwift 中订阅 Observable 或 Driver 花费的时间太长【英文标题】:Subscribing to Observable or Driver takes too long in RxSwift 【发布时间】:2018-01-07 15:07:14 【问题描述】:

我注意到 RxSwift 拖慢了应用程序,我不知道这是我的错还是框架的问题。

我在 UICollectionViewCell 的自定义类中进行了绑定,该类用于配置单元格。比如这部分代码:

viewModel.observableIsHighlighted.asDriver().drive(onNext:  isHighlighted in
    // do nothing
).disposed(by: disposeBag)
viewModel.observableIsMarked.asDriver().drive(onNext:  isMarked in
    // do nothing
).disposed(by: disposeBag)

其中observableIsHighlightedobservableIsMarked 只是BehaviorRelay<Bool>,大约需要 16-20 毫秒,这对于 UICollectionView 来说当然是不可接受的。

另一部分是这样的:

imageViewTapGestureRecognizer.rx.event.bind(onNext:  _ in
    // do nothing
).disposed(by: disposeBag)

大约需要 12 毫秒。

问题

是我的方法有问题还是 RxSwift 中的绑定对于 UICollectionView 之类的视图不准确?

当然,我假设 RxSwift 中的绑定完全适用于 UICollectionView 之类的东西。

编辑

我如何测量时间?

我用CACurrentMediaTime() 乘以1000。我知道这是最好的方法,但是非常简单的方法总是需要 0 ms,因此建议应该改进 10-20 ms 的方法。

【问题讨论】:

我很想知道您测量延迟的方式! 我正在使用 CACurrentMediaTime(),我知道这不是最好的方法,但我只是将代码放在实例化一个 CACurrentMediaTime() 和第二个 CACurrentMediaTime() 中,然后彼此相减。我想这还不错,因为代码的正常部分之间的减法只是 0。此外,我正在检查这一点,因为我的 UICollectionView 口吃。 我刚刚使用 CACurrentMediaTime 进行了测量,主要延迟为 0.06 毫秒。在后台发布并在 main 上收听时需要 3 毫秒。 你的意思是你测量了这部分代码,延迟只有0.06毫秒?我不知道该怎么想... 我明天会发布一些代码 【参考方案1】:

我不敢相信,但我在Podfile 中将4.0 中的RxCocoaRxCocoa 更新为4.1.0,现在它可以完美运行了。

问题中的方法现在大约需要 0-1 毫秒。

希望这个问题能对其他人有所帮助,或者也许有人会知道我为什么会遇到这种行为。

【讨论】:

非常有趣!这是升级/降级 pod 版本并比较行为的好方法。

以上是关于在 RxSwift 中订阅 Observable 或 Driver 花费的时间太长的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift 对一个 observable 的多个订阅

RxSwift)订阅一个 observable 两次不工作

在 RxSwift PublishSubject 上完成后订阅最后一个值

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

RxSwift 系列

Observable 的 RxSwift 用途