【问题标题】:Multicasting in ReactiveCocoa 3 and ReactiveCocoa 4ReactiveCocoa 3 和 ReactiveCocoa 4 中的多播
【发布时间】:2015-12-23 20:20:57
【问题描述】:

假设我有一个返回SignalProducer<AnyObject?, NSError> 的函数,我想将生产者绑定到多个MutableProperty<String>。所以,是这样的:

let foo = SignalProducer<AnyObject?, NSError>(value: nil)
let someProperty1 = MutableProperty<String>("")
let someProperty2 = MutableProperty<String>("")

someProperty1 <~ foo
    .flatMapError { _ in
        SignalProducer<AnyObject?, NoError>.empty
    }
    .map { _ in
        return "test"
    }

// someProperty2 <~ foo etc...

为了避免我的功能(例如一些网络内容)多次运行,我需要使用多播。据我从CHANGELOG 可以看出,startWithSignal 是用于此目的的运算符。但是我似乎无法弄清楚如何以声明方式执行此操作。

因此,一种方法可能是在 startWithSignal 的闭包中进行绑定:

foo.startWithSignal { signal, disposable in
    someProperty1 <~ signal
        .map { _ in
            return "test"
        }

    // someProperty2 <~ signal etc...
}

但是这显然会失败,因为我们需要删除 NSError 部分。因为我们给出的是Signal(与SignalProducer相对),所以我们不能使用flatMapError(在RAC4中,catch在RAC3中)。而且我看不到mapError 怎么能为我们做到这一点?最后,我什至不确定这是否是在 RAC3/RAC4 中处理多播的正确方法?

非常感谢任何帮助。

【问题讨论】:

    标签: ios swift reactive-cocoa reactive-cocoa-3


    【解决方案1】:

    starWithSignal 之前使用flatMapError(以及任何其他必须采用SignalProducer 参数的运算符)

    let fooIgnoreError = foo
        .flatMapError { _ in
            SignalProducer<AnyObject?, NoError>.empty
        }
    
    
    fooIgnoreError.startWithSignal { signal, disposable in
        someProperty1 <~ signal.map { _ in "test" }
        someProperty2 <~ signal.map { _ in "test2" }
    }
    

    如果fooIgnoreError 只启动一次,你的底层信号生产者foo 也保证只启动一次。

    【讨论】:

      【解决方案2】:

      我通过一个示例here 解释了如何实现多播

      至于错误,您可以使您的属性AnyProperty&lt;Result&lt;Value, Error&gt;&gt; 能够转发错误。如果您希望信号在失败时终止,您可以简单地

      signal.flatMapError { error in 
          fatalError("Error: \(error)") // or some other form of error handling, or simply ignoring the error?
          return .empty
      }
      

      【讨论】:

      • 这看起来正是我想要的。但是,我不确定我是否了解如何多播并能够转发错误。你能详细说明一下吗?
      • 我在这里解释了一点:stackoverflow.com/a/34010499/401024.
      • 抱歉没有更清楚,但我希望类型保持为SignalProducer&lt;AnyObject?, NSError&gt;。此答案中的示例将其映射到NoError,并且链接中的描述将包含Next 值中的任何错误。有没有可能实现我想要的?
      猜你喜欢
      • 2015-11-17
      • 2014-11-18
      • 2016-01-15
      • 1970-01-01
      • 2015-07-26
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多