我必须将应用程序从exectivecocoa 4迁移到eactivecocoa 5(由于迅速3迁移(
旧实现使用了一些racSubject实例来触发(performerationsUbject.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)
不幸的是,Racsubject不再存在于eactivecocoa 5(reactivesWift(
如何在此上下文中替换racsubject?
您将使用pipe
,它为您提供输入观察者和输出信号,而不是使用RACSubject
进行输入和输出。ReactiveSwift文档中的示例看起来像这样:
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:
由于信号类型(例如RACSUBEXT(总是"热",因此有一种特殊的类方法来创建可控信号。信号方法可以替换主题的使用,并通过将观察到的API与发送API分开来更好地表达意图。
使用管道,根据需要在信号上设置观察者,然后将值发送到水槽:
let (signal, observer) = Signal<String, NoError>.pipe()
signal.observeValue(value in
// use value
})
observer.send(value: "the value")