【发布时间】:2019-12-24 03:42:13
【问题描述】:
由于我是响应式编程的新手,我对在 ReactiveSwift 中链接 SignalProducers 有一些初学者的问题。我的目标是创建一个 SignalProducers 链,以测试我的一个流程。在进行 SignalProducer 链接时,我偶然发现了一个障碍。如果我最里面的 SignalProducer 正在调用 sendCompleted 它不会被传播到下游。这是 Playground 中的模拟代码
private func doSomethingWithString() -> SignalProducer<Int, Error> {
return SignalProducer<String, Error> {observer, _ in
observer.send(value: "Hello")
}.flatMap(.latest, doSomethingWithInt(string:))
}
private func doSomethingWithInt(string: String) -> SignalProducer<Int, Error> {
return SignalProducer<Int, Error> { observer, _ in
observer.send(value: 2)
observer.sendCompleted()
}
}
func test() -> SignalProducer<Int,Error> {
return doSomethingWithString()
}
func leGo() {
test().start { (event) in
switch event {
case .completed:
print("DONE")
case .value(let value):
print("WE HAVE A VALUE: \(value)")
case.interrupted:
print("INTERRUPTED")
case .failed(let error):
print("FAILED \(error)")
}
}
}
leGo()
在这个 sn-p 中,值按预期打印“WE HAVE A VALUE 2”,但从不执行完成,因此从不打印“DONE”。
如果有人解释为什么会这样以及如何正确地做到这一点,我将不胜感激。我可以通过在doSomethingWithString 中调用sendCompleted() 使其工作,但由于我的原始流有两个以上的方法,我不想在每个方法中都写它。另外.take(first:1) 是一个对我来说听起来很奇怪的选项,因为我真的不想通过所有链条来拿一件物品。相反,如果可能的话,我想在一个完成的地方终止整个流。
【问题讨论】:
标签: swift reactive-swift