ios - 将框架缓冲区运算符与 keepFull 策略相结合:它有什么作用?
问题描述
我的测试平台如下所示:
var storage = Set<AnyCancellable>()
override func viewDidLoad() {
let pub = Timer.publish(every: 0.2, on: .main, in: .common).autoconnect()
.scan(0) {i,_ in i+1}
.buffer(size: 4, prefetch: .keepFull, whenFull: .dropNewest)
.flatMap(maxPublishers:.max(1)) {
Just($0).delay(for: 2, scheduler: DispatchQueue.main)
}
pub.sink{print($0)}.store(in:&storage)
}
结果只是连续缓慢而稳定的数字流:1 2 3 4 5 6 ...
.buffer
但是,如果您只是完全删除该行,您会得到相同的结果。那么缓冲区有什么作用呢?换句话说:有人可以给我举个例子,说明带有.keepFull
预取策略的缓冲区会产生影响吗?
解决方案
缓冲区“缓冲区”值达到其大小,同时尊重下游的背压。
通过这种方式,它在上游发送的内容和下游准备接受的内容之间提供了一个间隙(缓冲区?)。如果下游尚未准备好接受,但已Timer
准备好接受,则只会删除值(使用预取策略达到其容量,或始终/无限制)Buffer
.keepFull
.byRequest
具体来说,在本例中,如果我们Timer
直接传递来自的值,缓冲区将接受所有初始结果(初始结果将相隔 0.2 秒),然后才被填充并稳定到稳态(相隔 2 秒)。
Timer.publish(every: 0.2, on: .main, in: .common).autoconnect()
.buffer(size: 4, prefetch: .keepFull, whenFull: .dropNewest)
.flatMap(maxPublishers:.max(1)) {
Just($0).delay(for: 2, scheduler: DispatchQueue.main)
}
这是另一个例子PassthroughSubject
:
let subject = PassthroughSubject<Int, Never>()
let c = subject
//.buffer(size: 4, prefetch: .keepFull, whenFull: .dropNewest)
.flatMap(maxPublishers:.max(1)) {
Just($0).delay(for: 2, scheduler: DispatchQueue.main)
}
.sink { print($0) }
subject.send(1)
subject.send(2) // 2 would be dropped without the buffer
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
subject.send(3)
}
话虽如此,我并不完全清楚.keepFull
vs的一个好的用例是什么.byRequest
。
推荐阅读
- node.js - Express(NodeJS)中具有动态参数匹配问题的网址
- angular - ng-bootstrap - 日期选择器的图标未显示
- c# - 使用现有文件的 EPPlus 更改数据透视表的范围
- jsrender - 使用双向数据绑定呈现由 ID 链接的两个数组
- leaflet - 无法删除传单多边形地图上的标记
- powershell - 尝试在 c:\ 上自动运行 chkdsk
- excel - 数组已经提及/下标超出范围
- string - sed 命令中的通配符替换字符串不起作用
- php - PHP readfile() 保留 mime 类型
- javascript - 发布 Web Assembly 与缩小 Javascript 相比是否有性能优势?