swift - 组合框架 removeDuplicates 的奇怪行为
问题描述
考虑:
let test = [(1,true), (2,false), (3,false), (4,true), (5,true), (6,true)]
test.publisher.removeDuplicates { $0.1 != $1.1 }
.sink { print($0.0) }
这是 (Int,Bool) 对的序列。我想在我的removeDuplicates
过滤器中说的是:“不要让 Bool 与之前的 Bool 发生变化的任何对通过。”
所以我期望的是:
2
不会通过,因为它false
与以前的不同true
4
不会通过,因为它true
与以前的不同false
所有其他人都应该通过,所以结果应该是1,3,5,6
。
但事实并非如此。是1,4,5,6
。
谁能解释为什么?这里使用的是什么推理removeDuplicates
?
我想我知道答案;我认为它将来自上游的当前值与允许通过过滤器的先前值进行比较。于是,1
与它打通true
,然后2
又3
被压制,因为它们false
与那个不同。
但这肯定不对吗?当然,我们应该与来自上游的先前值进行比较?
[文档实际上对此感到奇怪的腼腆。他们说“仅发布与前一个元素不匹配的元素”。我认为这意味着“从上游到达的前一个元素”。但似乎相反,它的意思是“我们实际发布到下游的前一个元素”?]
解决方案
的行为removeDuplicates
与其祖父 Rx.NET 的行为相匹配,DistinctUntilChanged
您可以在此处查看其源代码。
在“相等”值“a, a, a, ...”的流中,将每个新的“a”存储为先前值需要复制该值,并可能调整引用计数(如果它是具有引用属性的值类型)。坚持第一个“a”可以避免这项工作。
推荐阅读
- debhelper - 如何在 debhelper dh_gencontrol 中使用变量?
- python - 当列具有混合类型时如何格式化熊猫样式器?
- media-player - Roku Player 播放 HLS 流一旦停止然后再次播放抛出错误
- rest - Apex Rest 上下文问题
- node.js - bot.hears() 函数在重构后不起作用
- javascript - 如何在 JavaScript 中将值转换为键并将另一个键转换为值
- google-sheets - 如何使用 REGEXEXTRACT 提取除 URL 协议 (https://) 之外的所有内容?
- python - 如何检测输入输出是python中的数字?
- javascript - 动态添加具有最小值和最大值的 Highcharts 系列
- reactjs - React 根据 div id 在 div 中动态渲染组件