我必须将应用程序从ReactiveCocoa 4迁移到ReactiveCocoa 5(由于Swift 3迁移)
旧实现使用一些RACSubject实例来触发(performOperationSubject.sendNext)操作并处理(didOperationSubject.subscribeNext)结果
internal class MyClass {
internal var performOperationSubject: RACSubject = RACSubject()
internal var didOperationSubject: RACSubject = RACSubject()
internal overide init() {
super.init()
self.performOperationSubject.subscribeNext { [weak self](_) in
guard let strongSelf = self else { return }
strongSelf.didOperationSubject.sendNext(result)
}
}
以及何时使用MyClass实例
myClassInstance.didOperationSubject.subscribeNext { ... }
myClassInstance.performOperationSubject.sendNext(value)
不幸的是,RACS主题在ReactiveCocoa 5(ReactiveSwift)中不再存在
如何在此上下文中替换RACS主题?
答案 0 :(得分:3)
您可以使用pipe
为输入和输出提供输入观察者和输出信号,而不是使用RACSubject
。 The example from the ReactiveSwift docs看起来像这样:
let (signal, observer) = Signal<String, NoError>.pipe()
signal
.map { string in string.uppercased() }
.observeValues { value in print(value) }
observer.send(value: "a") // Prints A
observer.send(value: "b") // Prints B
observer.send(value: "c") // Prints C
使用Signal.pipe代替RACSubject:
由于Signal类型(如RACSubject)总是“热”,因此有一种特殊的类方法可用于创建可控信号。 Signal.pipe方法可以替代主题的使用,并通过将观察API与发送API分离来更好地表达意图。
要使用管道,请根据需要在信号上设置观察者,然后将值发送到接收器:
let (signal, observer) = Signal<String, NoError>.pipe()
signal.observeValue(value in
// use value
})
observer.send(value: "the value")