在 RAC 3+ 中将 combineLatest 与 UITextFields 结合使用

Using combineLatest with UITextFields in RAC 3+

我想简单地 "combine" 一些文本字段发出的信号并触发一段代码。 "should" 似乎有几种方法可以使用 combineLatest()values: SignalProducer 初始值设定项等方法。但是我无法按预期编译或运行任何东西。

RAC 文档使用以下示例

combineLatest(numbersSignal, lettersSignal)
  |> observe(next: println, completed: { println("Completed") })

但是我无法编译这种用法

我可以使用冗余块执行以下操作...

locationTextfield.rac_textSignal().toSignalProducer()
  |> start(next: { txt in
    println(txt)
  })

aircraftTextfield.rac_textSignal().toSignalProducer()
  |>  start(next: { txt in
    println(txt)
  })

我也不明白为什么我需要使用 toSignalProducer() 并开始而不是仅仅观察 rac_textsignal 本身。这 "compiles" 但除非创建并启动生产者,否则信号似乎没有发送任何内容。

这个 question/answer 也有效,但似乎仍然是一种解决方法,并且没有解释为什么需要创建信号生成器而不是观察原始 rac_textSignal()s

观察 rac_textSignal 无需转换是可能的,我们只需要澄清一下 rac_textSignal is RACSignal。 RACSignal 是 ReactiveCocoa 2.0 信号,与 Objective-C 版本相关。因此,您需要将 RAC2 运算符应用于此类信号,combineLatestWith: 可以帮助您解决此类任务。

由于 RAC3 中基本概念的差异,需要进行转换才能应用 Swift 运算符。在 RAC2 中,这样的核心实体是 RACSignal,与 RAC3 中的 SignalSignalProducer 相对。