2

假设我有一个返回 a 的函数,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...

为了避免我的功能(例如一些网络内容)多次运行,我需要使用多播。据我所知,CHANGELOGstartWithSignal用于此目的的操作员。但是我似乎无法弄清楚如何以声明的方式做到这一点。

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

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

    // someProperty2 <~ signal etc...
}

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

任何帮助深表感谢。

4

2 回答 2

0

我在这里用一个例子解释了如何实现多播

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

signal.flatMapError { error in 
    fatalError("Error: \(error)") // or some other form of error handling, or simply ignoring the error?
    return .empty
}
于 2015-12-01T00:33:45.593 回答
0

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

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则保证您的底层信号生成器也仅启动一次。

于 2015-10-04T04:43:36.380 回答