ios 在合并和RxSwift中,throttle操作符的行为不同,有什么原因吗?

wa7juj8i  于 2023-06-07  发布在  iOS
关注(0)|答案(1)|浏览(152)

我在合并中使用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

tvmytwxo

tvmytwxo1#

latest参数在两个运算符中的含义有所不同。在合并版本上将latest设置为true以获得相同的行为。

相关问题