gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:36:00 24 4
gpt4 key购买 nike

从 reactive swift 的文档中我可以理解Flattening。可以找到其中的示例 here .在 Flattening event streams 部分中,一切都得到了完美的讨论。

我对 flatmap 感到困惑。根据文档,它将每个事件从 self 映射到一个新的生产者,然后根据策略 - 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 的闭包总是在有新值进来时立即运行。但是生成的生产者根据扁平化策略启动和取消。

关于ios - ReactiveSwift 中平面图策略之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58607151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com