我在合并中使用throttle操作符时遇到了一些问题,看起来Combine的throttle操作符没有限制异步序列的前两个元素。
下面是我写的代码来验证这个问题。为了方便测试,我定义了一个父类来 Package 合并和RxSwift中Subject信号的使用。
class MyAnyPublisher<Element> {
init() {
setupOperator()
}
func setupOperator() {}
func send(_ E: Element) {}
}
class MyCombinePublisher<Element>: MyAnyPublisher<Element> {
let publisher = PassthroughSubject<Element, Never>()
private var cancellables = Set<AnyCancellable>()
override func setupOperator() {
publisher
.throttle(for: .seconds(1), scheduler: DispatchQueue.main, latest: false)
.sink { value in
print("Received value: \(value)")
}.store(in: &cancellables)
}
override func send(_ e: Element) {
publisher. send(e)
}
}
class MyRxPublisher<Element>: MyAnyPublisher<Element> {
let subject = PublishSubject<Element>()
private let disposeBag = DisposeBag()
override func setupOperator() {
subject
.throttle(.milliseconds(1000), latest: false, scheduler: MainScheduler.instance)
.subscribe(onNext: { s in
print("Received value \(s)")
})
.disposed(by: disposeBag)
}
override func send(_ e: Element) {
subject.onNext(e)
}
}
我希望能够按照1s的间隔来控制异步序列的限流,并编写了以下测试代码
func testPublisher(_ publisher: MyAnyPublisher<String>) {
DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.1) {
publisher.send("A")
publisher.send("B")
publisher.send("C")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
publisher.send("D")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.4) {
publisher.send("E")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) {
publisher.send("F")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1.2) {
publisher.send("G")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1.4) {
publisher.send("H")
}
DispatchQueue.main.asyncAfter(deadline: .now() + 1.6) {
publisher.send("I")
}
}
根据我对RxSwfit的油门和实际建筑的了解,RxSwift会打印以下内容
MyRxPublisher
Received value A
Received value G
但是,合并的打印结果如下
MyCombinePublisher
Received value: A
Received value: D
Received value: G
无论我如何调整代码和时间,合并的节流阀似乎总是打印第一个和第二个元素,有人知道为什么吗?
我的版本信息Xcode:14.3 iOS:16.5
1条答案
按热度按时间tvmytwxo1#
latest
参数在两个运算符中的含义有所不同。在合并版本上将latest设置为true以获得相同的行为。