在 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)
其中observableIsHighlighted
、observableIsMarked
只是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
中的RxCocoa
和RxCocoa
更新为4.1.0
,现在它可以完美运行了。
问题中的方法现在大约需要 0-1 毫秒。
希望这个问题能对其他人有所帮助,或者也许有人会知道我为什么会遇到这种行为。
【讨论】:
非常有趣!这是升级/降级 pod 版本并比较行为的好方法。以上是关于在 RxSwift 中订阅 Observable 或 Driver 花费的时间太长的主要内容,如果未能解决你的问题,请参考以下文章