如何调用依赖于 reactivecocoa4 中不同信号生成器的信号生成器
how to call signal producer that depend to different signal producer in reactivecocoa4
我有 2 个这样的信号发生器
func textSignal() -> SignalProducer(String?,NoError)
和
func searchSignal(text:String) -> SignalProducer([User]?,NSError)
如何在没有嵌套函数的情况下调用searchSignal?因为 flatmap
和 attemptMap
需要像这种情况一样的错误结果 NoError
和 NSError
必须解决 2 个类型差异才能组合这两个函数。
原始信号可以携带 nils,而您尝试 flatMap
它的函数不接受 nil
s。类型系统告诉你,你需要选择一个策略来决定在这些情况下要做什么。部分选项:
- 过滤器 nils:
textSignal.filter { [=12=] != nil }.map { [=12=]! }
不推荐,因为您会忽略这些值,因此如果用户搜索 "foo",然后文本字段生成 nil 字符串,应用程序仍会显示 [=50= 的搜索结果].
使搜索函数允许 nil:这很容易做到,但您实际上只是将问题转移到另一个函数,它必须处理 nil 值。
将 nil 字符串视为空字符串
textSignal.map { [=13=] ?? "" }
这可能是最简单且产生最自然结果的一种。
第二个区别是错误类型。原始信号不会产生错误,但第二个信号会。使用 promoteErrors
函数,我们可以将第一个函数从 NoError
转换为 NSError
,如下所示:
textSignal.promoteErrors(NSError)
使用 NoError 信号是安全的,因为我们知道在编译时它们实际上不会产生错误,因此不需要强制转换就可以将其更改为 NSError。
我有 2 个这样的信号发生器
func textSignal() -> SignalProducer(String?,NoError)
和
func searchSignal(text:String) -> SignalProducer([User]?,NSError)
如何在没有嵌套函数的情况下调用searchSignal?因为 flatmap
和 attemptMap
需要像这种情况一样的错误结果 NoError
和 NSError
必须解决 2 个类型差异才能组合这两个函数。
原始信号可以携带 nils,而您尝试 flatMap
它的函数不接受 nil
s。类型系统告诉你,你需要选择一个策略来决定在这些情况下要做什么。部分选项:
- 过滤器 nils:
textSignal.filter { [=12=] != nil }.map { [=12=]! }
不推荐,因为您会忽略这些值,因此如果用户搜索 "foo",然后文本字段生成 nil 字符串,应用程序仍会显示 [=50= 的搜索结果].
使搜索函数允许 nil:这很容易做到,但您实际上只是将问题转移到另一个函数,它必须处理 nil 值。
将 nil 字符串视为空字符串
textSignal.map { [=13=] ?? "" }
这可能是最简单且产生最自然结果的一种。
第二个区别是错误类型。原始信号不会产生错误,但第二个信号会。使用 promoteErrors
函数,我们可以将第一个函数从 NoError
转换为 NSError
,如下所示:
textSignal.promoteErrors(NSError)
使用 NoError 信号是安全的,因为我们知道在编译时它们实际上不会产生错误,因此不需要强制转换就可以将其更改为 NSError。