ios - ReactiveCocoa 3 和 ReactiveCocoa 4 中的多播

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

假设我有一个返回 SignalProducer<AnyObject?, NSError> 的函数我想将生产者绑定(bind)到多个 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 的闭包中进行绑定(bind):

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

    // someProperty2 <~ signal etc...
}

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

非常感谢任何帮助。

最佳答案

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 也保证仅启动一次。

关于ios - ReactiveCocoa 3 和 ReactiveCocoa 4 中的多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791696/

相关文章:

ios - 将 RACCommand 与异步网络操作结合使用

objective-c - ReactiveCocoa 中的缓存失效

ios - 在 alamofire swift ios 中发布阿拉伯字符

ios - 我可以在没有 SKAction 的情况下在屏幕上移动节点吗?

swift - 如何访问 SpriteKit 场景编辑器引用节点上的自定义类中包含的 Swift 变量?

ios - 如何在ScrollView中为ImageView设置自动布局约束?

ios - iOS 的 RDTSC 等效项

ios - 为什么Xcode总是不显示参数默认值的提示?

ios - 在哪里放置数据数组

ios - 根据 ReactiveCocoa 4 中 UITextField 中的字符数启用/禁用 UIButton