- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
给定函数 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 和大多数其他函数,但找不到更好的解决方案。
最佳答案
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/
假设我有一个 SignalProducer启动时发出一个元素数组。 我想转换 SignalProducer到一个新的SignalProducer发出 [Element] 的每个元素连续排列。 这样做的
我有一个带有 MutableProperty 的模型我有一个 UIButton (ctaTopButton) 应该在按下时翻转该属性,例如,单击时 true 变为 false,反之亦然。 我是这样设置
我尝试创建一个 Action 的实例ReactiveCocoa 3. let action: Action = Action { _ in if self.flag { ret
给定函数 multiply() 和 convert()(概念的最小示例,我实际上计划在每个函数中查询远程服务器),什么是实现 multiplyAndConvert() 的更短方法? // call t
假设我在数组中有一堆 SignalProducer: [SignalProducer] 我如何将它们组合起来得到一个 SignalProducer 等待所有这些并获得所有 Car? SignalPro
我有一个包含数组的 SignalProducer,我只想观察新的更改,而不是在观察时获取整个数组 我尝试了 flatMap .latest 但它不起作用 有人知道如何做到这一点吗? 最佳答案 我相信
我怎么映射这个 func save() -> SignalProducer 到 var saveAction: Action 我对语法有点困惑 service.save() .
这可能是 Swift 的问题,或者只是我不了解泛型在 Swift 中的工作方式,但我在使用以下代码示例时遇到编译器错误/崩溃,我不明白为什么 import Foundation import Reac
我觉得我理解了 ReactiveCocoa 的所有基本组件(概念上),通过理解如何将所有部分连接在一起仍然有点困惑。 例如,在阅读了 Signal 之后,我完全希望 SignalProducer 只有
我正在 iOS 项目中使用 ReactiveSwift 3.x,但无法将一个 SignalProducer 提供的错误映射到另一个错误。 我的NoError SignalProducer是: func
由于我是响应式(Reactive)编程的新手,所以我对在 ReactiveSwift 中链接 SignalProducers 有一些初学者的问题。我的目标是创建一个 SignalProducers 链
我是否有责任维护对 Signal 或 SignalProducer 的引用,例如,使用实例变量? 换句话说,当它们被释放时,它们会自动消失并停止发送事件吗? 最佳答案 仅供引用,没有必要,Signal
我正在尝试学习 ReactiveSwift 和 ReactiveCocoa。我可以很好地使用 Signal 和 Property,但我在使用 SignalProducer 时遇到了问题。 据我了解,S
我正在使用 ReactiveCocoa 并且我有几个 SignalProducers let center = NSNotificationCenter.defaultCenter() let sig
我正在尝试将 API SignalProducers 转换为枚举,以便获得“正在加载”、“失败”和“已加载”状态。枚举是: enum DataLoadState{ case Loading
我的应用程序顶部有一个状态区域,显示进度信息(类似于 Xcode 和 iTunes)。我想通过将副作用注入(inject)事件流来更新它,使用将流的值转换为 ProgressUpdate 值的闭包。我
我有一个具有几个不同功能的 View 模型,如下所示: func somethingSignal() -> SignalProducer { return SignalProducer {
我有一个 SignalProducer ProducerA,它以不同的时间间隔发出值。我正在尝试收集 SignalProducer 发出的最新 N 个值并创建一个新的生产者 ProducerB,它发出
我有一个委托(delegate)对象。有 6 个委托(delegate)回调通知委托(delegate)有关事物的状态。我有一个 MySpecialEvent代表这些状态的快速枚举。你能帮我弄清楚如何
我正在使用 Swift 3 开发一个 iOS 应用程序,使用 ReactiveSwift 1.1.1、MVVM + Flow Coordinator 模式和 Firebase 作为后端。我最近才开始适
我是一名优秀的程序员,十分优秀!