如何调用依赖于 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?因为 flatmapattemptMap 需要像这种情况一样的错误结果 NoErrorNSError

必须解决 2 个类型差异才能组合这两个函数。

原始信号可以携带 nils,而您尝试 flatMap 它的函数不接受 nils。类型系统告诉你,你需要选择一个策略来决定在这些情况下要做什么。部分选项:

  • 过滤器 nils:

textSignal.filter { [=12=] != nil }.map { [=12=]! }

不推荐,因为您会忽略这些值,因此如果用户搜索 "foo",然后文本字段生成 nil 字符串,应用程序仍会显示 [=50= 的搜索结果].

  • 使搜索函数允许 nil:这很容易做到,但您实际上只是将问题转移到另一个函数,它必须处理 nil 值。

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

textSignal.map { [=13=] ?? "" }

这可能是最简单且产生最自然结果的一种。

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

textSignal.promoteErrors(NSError)

使用 NoError 信号是安全的,因为我们知道在编译时它们实际上不会产生错误,因此不需要强制转换就可以将其更改为 NSError。