【发布时间】:2020-07-11 00:19:59
【问题描述】:
我有一个 Int plublishers 数组正在通过网络进行更改,我想将它的总和分配给一个变量。 到目前为止,我想出了这个:
cancellable = Publishers.MergeMany(items.map { $0.$count } ).sink { value in
print(value)
}
它正在打印所有的值,但我真正想要的是将它们全部减少为一个值,然后分配给其他地方。但是当我尝试做一个 reduce 时,就像这样:
cancellable = Publishers.MergeMany(items.map { $0.$count } )
.reduce(0){ counter, value in
counter + value
}.sink { value in
print (value)
}
它不再起作用了,该值永远不会被打印出来。我究竟做错了什么? 谢谢
编辑:
这似乎可行,但看起来效率不高
cancellable = Publishers.MergeMany(items.map { $0.$count })
.sink { _ in
let value = self.items.map { $0.count}.reduce(0) { counter, newValue in
counter + newValue
}
print(value)
}
【问题讨论】:
-
你能解释一下你所说的“一系列 Int 出版商”是什么意思吗?在 最后一个值 到达之前,Combine
reduce不会运行。这些发布者在什么意义上发出最后一个值? -
我注意到如果我在 reduce 中添加打印机,它会一直打印。在我的示例中,我只有 2 个发布者,两者的 $count = 1,所以总数应该是 2。但是如果我让应用程序运行,打印将永远进行,总是将最后一个值 + 新值添加到无穷大。似乎 reduce 不知道何时收集了所有发布者,但我不知道如何发出信号
-
@matt 看到我的评论。我认为这是问题所在,我不知道如何告诉reduce所有发布者都被“收集”了。在我上面的例子中,
items有 2 个对象:@Published private(set) var count = 0 我要做的是检查所有项目,将计数相加并得到结果。 -
@matt 它永远不会发出最后一个值,它会永远轮询。我只想要一个时间点上所有这些的总和。
-
嗯,这就是你的答案。