gpt4 book ai didi

swift - 如何链接传递结果的 SignalProducers

转载 作者:搜寻专家 更新时间:2023-11-01 06:37:17 24 4
gpt4 key购买 nike

给定函数 multiply()convert()(概念的最小示例,我实际上计划在每个函数中查询远程服务器),什么是实现 multiplyAndConvert() 的更短方法?

// call two async functions passing the result the from the first 
// as the argument to the second
multiplyAndConvert(3).startWithResult { val in
print("\(val.value!)")
}

func convert(_ val: Int) -> SignalProducer<String, NSError> {
return SignalProducer<String, NSError> { observer, _ in
observer.send(value: String(val))
observer.sendCompleted()
}
}

func multiply(_ val: Int) -> SignalProducer<Int, NSError> {
return SignalProducer<Int,NSError> { observer, _ in
observer.send(value: val * 2)
observer.sendCompleted()
}
}

func multiplyAndConvert(_ val: Int) -> SignalProducer<String, NSError> {
return SignalProducer<String, NSError> { observer, _ in
multiply(val).startWithResult { res2 in
switch res2 {
case .success(let val2):
convert(val2).startWithResult { res3 in
switch res3 {
case .success(let val3):
observer.send(value:val3)
observer.sendCompleted()
case .failure(let err):
observer.send(error:err)
}
}
case .failure(let err):
observer.send(error: err)
}
observer.sendCompleted()
}
}
}

我知道必须有一种更优雅的方法来做到这一点,但我不知道它是什么。我尝试过 map、flatMap、flatten 和大多数其他函数,但找不到更好的解决方案。

最佳答案

使用平面 map :

func multiplyAndConvert(_ val: Int) -> SignalProducer<String, NSError> {
return multiply(val).flatMap(.concat) { multipliedVal in
return convert(multipliedVal)
}
}

你也可以通过convert直接作为 flatMap 的第二个参数而不是给它一个闭包,因为它已经是正确的类型(Int -> SignalProducer<String, NSError>)

multiply(val).flatMap(.concat, transform: convert)

但是如果convert功能引用 self在您的扩展代码中,这可能会导致保留循环,在这种情况下,您需要传递一个闭包捕获 [weak self]

解释

什么 flatMap这里做的是接受你的乘法信号:

-----.value(multipliedValue)-.completed

并使用提供的闭包将其映射为信号中的信号:

    .value(convertedMultipliedValue)
/
----x-.completed

然后“展平”这个信号中的信号(使用 .Concat 展平策略,它通过连接所有子信号来展平信号中的信号——但这在这里并不重要,因为我们只是展平单个信号 child 信号)给我们:

----.value(convertedMultipliedValue)-.completed

关于swift - 如何链接传递结果的 SignalProducers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40027218/

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