Combine 框架 removeDuplicates 的奇怪行为
curious behavior of Combine framework removeDuplicates
考虑:
let test = [(1,true), (2,false), (3,false), (4,true), (5,true), (6,true)]
test.publisher.removeDuplicates { [=10=].1 != .1 }
.sink { print([=10=].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
的行为相匹配,您可以查看其源代码 here。
在“相等”值“a、a、a、...”的流中,将每个新的“a”存储为先前的值需要复制该值,并可能调整引用计数(如果它是具有参考属性)。抓住第一个“a”可以避免这项工作。
考虑:
let test = [(1,true), (2,false), (3,false), (4,true), (5,true), (6,true)]
test.publisher.removeDuplicates { [=10=].1 != .1 }
.sink { print([=10=].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
的行为相匹配,您可以查看其源代码 here。
在“相等”值“a、a、a、...”的流中,将每个新的“a”存储为先前的值需要复制该值,并可能调整引用计数(如果它是具有参考属性)。抓住第一个“a”可以避免这项工作。