【问题标题】:Handle two signals the same way in ReactiveCocoa在 ReactiveCocoa 中以相同的方式处理两个信号
【发布时间】:2015-10-27 22:15:02
【问题描述】:

假设我有两个信号

textField1Signal
|> map { value in
    return value.lowercaseString
}
|> on (
    next: { value in
         println("textField1 changed to \(value)");
    }
)


textField2Signal
|> map { value in
    return value.lowercaseString
}
|> on (
    next: { value in
        println("textField2 changed to \(value)");
    }
)

我想要实现的是这样的:

(textField1Signal & textField2Signal)
|> map { value in
    return value.lowercaseString
}
|> on (
    next: { value in
         println("one of the textFields changed to \(value)");
    }
)

关键是我有几个信号,我想以相同的方式处理所有信号。 combineLatest: 在这种情况下不起作用,因为首先当只有一个信号触发时它不会被触发,其次我会从两个文本字段中获取值并且不知道哪个实际导致了调用。

【问题讨论】:

  • 好像你在找merge运营商
  • 你能举个例子吗?
  • 最新 RAC 中似乎没有 merge 运算符 - 您需要先创建 SignalProducerSignalProducers ,然后将它们合并查看 flatten(,Merge) 运算符。我今天不在我的 Mac 后面 - 所以无法编写经过测试的答案,但这里有一些关于如何做到这一点的指示:github.com/ReactiveCocoa/ReactiveCocoa/issues/1929

标签: ios signals reactive-cocoa frp reactive-cocoa-3


【解决方案1】:

在 Jakub Vanos 的帮助下,我找到了以下解决方案

SignalProducer<SignalProducer<String, NSError>, NSError>(values: [textField1Signal, textField2Signal])
|> flatten(.Merge)
|> map { value in
    return value.lowercaseString
}
|> on (
    next: { value in
        println("one of the textFields changed to \(value)");
    }
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多