如何调用依赖于reactivecocoa4中不同信号产生者的信号产生者

时间:2016-01-21 17:00:49

标签: ios swift reactive-cocoa

我有2个像这样的信号生产者

func textSignal() -> SignalProducer(String?,NoError)

func searchSignal(text:String) -> SignalProducer([User]?,NSError)

如何在没有嵌套函数的情况下调用searchSignal?自flatmap& attemptMap需要相同的错误结果,例如NoErrorNSError

1 个答案:

答案 0 :(得分:2)

必须修复两种类型差异才能组合这两种功能。

原始信号可以携带nils,而您尝试flatMap它的功能并不接受nil。类型系统告诉您需要选择一个策略来确定在这些情况下该怎么做。一些选择:

  • 过滤nils:

textSignal.filter { $0 != nil }.map { $0! }

不推荐,因为您将忽略这些值,因此如果用户搜索" foo",然后文本字段生成一个零字符串,该应用仍会显示&的搜索结果#34;富"

  • 使搜索功能允许nils:这很容易做到,但你真的只是将问题转移到另一个函数,这个函数必须处理nil值。

  • 将空字符串视为空字符串

textSignal.map { $0 ?? "" }

这可能是最简单的,也是产生最自然结果的那个。

第二个区别是错误类型。原始信号不会产生错误,但第二个信号可以产生错误。使用promoteErrors函数,我们可以将第一个函数从NoError转换为NSError,如下所示:

textSignal.promoteErrors(NSError)

这对于NoError信号是安全的,因为我们在编译时知道它们实际上不会产生错误,因此不需要将其更改为NSError。