在ReactiveCocoa 3和ReactiveCocoa 4中进行多播

时间:2015-09-25 22:46:09

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

假设我有一个返回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中,在{RAC3中为catch)。我不知道mapError如何为我们做这件事?最后,我甚至不确定这是在RAC3 / RAC4中处理多播的正确方法吗?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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也只能启动一次。

答案 1 :(得分:0)

我解释了如何使用示例here实现多播

对于错误,您可以让您的媒体资源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
}
相关问题