ios 如何在合并publisher的事件之间强制最小延迟

l3zydbqr  于 2023-07-01  发布在  iOS
关注(0)|答案(1)|浏览(121)

如何强制从合并发布服务器发出的事件之间的最小间隔?假设我希望所有来自上游的事件都被发出,但它们之间的间隔最小,假设为1。如果上游中两个事件之间的间隔> 1 s,则事件应按原样发出。到目前为止,我已经尝试了这样的东西:

let subject = PassthroughSubject<Int, Never>()

let result = subject.flatMap(maxPublishers: .max(1)) {
    Just($0).delay(for: 1, scheduler: RunLoop.main)
}

let cancellable = result.sink {
    print("--- value \($0) ---")
}

// Emitting values
subject.send(1)

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
    subject.send(2)
}

DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) {
    subject.send(3)
}

DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {
    subject.send(4)
}

但我得到的结果是

--- value 1 ---
--- value 4 ---

你知道怎么做吗?

afdcj2ne

afdcj2ne1#

我不认为合并提供了一个工具,.throttle.debounce肯定不是你要找的。使用flatMap(maxPublishers: .max(1))将使2和3消失,因为它将阻止.delay接收它们(没有存储空间,因此您必须添加一个)。
这是我发现的一个使用缓冲区的解决方案,可能会有效果:Add delay between values emitted by publisher in Combine Framework in iOS
我用你的代码进行了测试,它工作正常。

subject
    .buffer(size: Int.max, prefetch: .byRequest, whenFull: .dropOldest)
    .flatMap(maxPublishers: .max(1)) {
          Just($0).delay(for: .seconds(1), scheduler: RunLoop.main)
    }.sink(receiveValue: { value in
          print(value)
    }.store(&cancellables)

相关问题