ReactiveSwift中平面图策略之间的差异



从reactive swift的文档中,我可以理解Flattening。可以在这里找到其示例。在Flattening event streams部分中,所有内容都进行了完美的讨论。

我对flatmap感到困惑。根据文件,它是Maps each event from self to a new producer, then flattens the resulting producers according to strategy - concat/merge/latest。所以,我想它应该类似于flattening

但是,我无法产生类似的行为。例如,考虑以下代码段。如果我像concat/merge/latest那样改变扁平化策略,输出不会改变。

let (numbersSignal, numbersObserver) = Signal<String, NoError>.pipe()

numbersSignal.producer.flatMap(.concat) { value -> SignalProducer<String, NoError> in
print("Outer Signal Producer (value)")
return SignalProducer<String, NoError> {
observer, lifetime in
print("Inner Signal Producer (value)")
observer.send(value: "Inner")
observer.sendCompleted()
}
}.observe(on: UIScheduler()).startWithValues { result in
print("Observer (result)")
}

numbersObserver.send(value: "A")
numbersObserver.send(value: "B")
numbersObserver.send(value: "C")
numbersObserver.sendCompleted()

输出:

Outer Signal Producer A
Inner Signal Producer A
Observer Inner
Outer Signal Producer B
Inner Signal Producer B
Observer Inner
Outer Signal Producer C
Inner Signal Producer C
Observer Inner

有人能清理一下吗?

此外,能否提供任何关于flatmap的例子来区分merge, concat, latest的效果?

这里发生的事情是,您在flatMap中创建的生产者同步完成;您正在启动闭包本身中调用sendCompleted。因此,在flatMap中,它在生产者上调用start,生产者在对start的调用返回之前就已经完成了。这意味着flatMap没有机会应用不同的策略;每个生产者在启动后立即完成。

我们可以通过在flatMap中创建一个异步生产者来了解不同策略的行为(注意,我使用的是Swift和ReactiveSwift的最新版本,所以我使用Never而不是NoError(:

let (numbersSignal, numbersObserver) = Signal<TimeInterval, Never>.pipe()
numbersSignal.producer
.flatMap(.concat) { value -> SignalProducer<TimeInterval, Never> in
print("Outer Signal Producer (value)")
return SignalProducer(value: value).delay(value, on: QueueScheduler())
}
.startWithValues { result in
print("Observer (result)")
}

numbersObserver.send(value: 5)
numbersObserver.send(value: 2)
numbersObserver.send(value: 1)

在本例中,我们发送TimeInterval值,每个创建的生产者发送给定值的延迟等于该值。

concat:每个后续生产者在开始之前都会等待上一个生产者完成,因此这些值会按照我们发送它们的确切顺序打印。

Outer Signal Producer 5.0
Outer Signal Producer 2.0
Outer Signal Producer 1.0
Observer 5.0
Observer 2.0
Observer 1.0

合并:一旦我们发送值,所有生产者都会立即启动,因此它们都会同时运行。因此,打印的值从最小到最大,即延迟最短的生产商首先完成。

Outer Signal Producer 5.0
Outer Signal Producer 2.0
Outer Signal Producer 1.0
Observer 1.0
Observer 2.0
Observer 5.0

最新:只打印最后一个值,因为每个生产者都会在新值出现时被取消;只允许最后一个值运行到完成。

Outer Signal Producer 5.0
Outer Signal Producer 2.0
Outer Signal Producer 1.0
Observer 1.0

请注意,在这三种情况下,所有值都会首先打印"外部信号生成器"消息。这是因为当一个新的值出现时,我们给flatMap的闭包总是立即运行。但生成的生产者会根据压平策略启动和取消。

相关内容

  • 没有找到相关文章

最新更新