【发布时间】:2020-01-10 06:35:44
【问题描述】:
我有一个关于结合背压的组合中的 zip 运算符的问题。
取如下代码sn-p:
let sequencePublisher = Publishers.Sequence<Range<Int>, Never>(sequence: 0..<Int.max)
let subject = PassthroughSubject<String, Never>()
let handle = subject
.zip(sequencePublisher.print())
.print()
.sink { letters, digits in
print(letters, digits)
}
subject.send("a")
在操场上执行此操作时,输出如下:
receive subscription: (0..<9223372036854775807)
receive subscription: (Zip)
request unlimited
request unlimited
receive value: (0)
receive value: (1)
receive value: (2)
receive value: (3)
receive value: (4)
receive value: (5)
receive value: (6)
receive value: (7)
...
在 iOS 设备上执行时,由于内存问题,代码在几秒钟后崩溃。
根本原因可以在上面的第四行中看到,其中zip 从sequencePublisher 请求无限数量的值。由于sequencePublisher 提供了整个Int 值范围,这会导致内存溢出。
我想知道的:
-
zip等待每个发布者的一个值,然后将它们合并并推送它们 - 背压用于控制从订阅者到发布者的需求
我的期望是zip 只向每个发布者请求一个值,等待它们到达,并且仅在从每个发布者收到一个值时才请求下一个值。
在这种特殊情况下,我尝试构建一种行为,其中将序列号分配给subject 生成的每个值。但是,我可以想象,当zip 结合来自发布频率非常不同的发布者的值时,这总是一个问题。
在zip 运算符中利用背压似乎是解决该问题的完美工具。你知道为什么不是这样吗?这是一个错误还是故意的?如果是故意的,为什么?
谢谢大家
【问题讨论】:
标签: ios swift reactive-programming combine