问题很简单,但我无法找到一个好的解决方案。
我们说我有一个流。流只能发送4个事件:A,B,C,D
它可以表示为:
[--A--A----C---B--D--...]
现在考虑一下,每个事件都有其编码值。 例如:
A -> 1, 0, 0, 0
B -> 0, 1, 0, 0
...
现在,问题是:如何使用A,B,C,D事件的编码值转换此流,而不是将每个事件表示为4个事件。
为了使一切清楚,这就是我想要的:
我的流:
[--A--A----C---B--D--...]
我知道:
A -> 1, 0, 0, 0
B -> 0, 1, 0, 0
...
我要制作的信息流:
[--1-0-0-0--1-0-0-0----0-0-1-0---0-1-0-0--0-0-0-1--...]
我能想到的一个解决方案是映射流,为每个事件返回子流,然后展平结果。但我不确定如何在FRP方面实施。
如果我应该使用流的组合,请提供相关示例。 我亲自使用Reactive-Cocoa,但你可以使用任何其他语言回答,它并不重要。
答案 0 :(得分:1)
我找到了适用于我的解决方案。我对扁平流的猜测非常合理。所以这就是我如何达到预期的结果:
// first producer is SignalProducer<String, NoError>
// which posts events "A", "B", "C", "D"
let secondProducer = firstProducer.flatMap(.Latest, transform: { value -> SignalProducer<Bool, NoError> in
let result:[Bool] = ["A" == value, "B" == value, "C" == value, "D" == value]
return SignalProducer<Bool, NoError>(values: result)
})
secondProducer.startWithNext({value in
print("value : \(value)")
})
这里的要点是:我使用flatMap将第一个信号产生器转换为第二个,将A,B,C和D中的每一个编码为Bool的4个信号。
这是Frp的基础知识,但我希望有些初学者能发现它很有用。