RACSubject 迁移到 ReactiveCocoa 5 (Swift 3)
RACSubject migration to ReactiveCocoa 5 (Swift 3)
我必须将应用程序从 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)
不幸的是,RACSubject 不再存在于 ReactiveCocoa 5 (ReactiveSwift)
如何在这种情况下替换 RACSubject?
您将使用 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,总是“热”的,所以有一种特殊的 class 方法来创建可控信号。 Signal.pipe方式可以代替主语,将观察API和发送API分开,更好地表达意图。
要使用管道,根据需要在信号上设置观察器,然后将值发送到接收器:
let (signal, observer) = Signal<String, NoError>.pipe()
signal.observeValue(value in
// use value
})
observer.send(value: "the value")
我必须将应用程序从 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)
不幸的是,RACSubject 不再存在于 ReactiveCocoa 5 (ReactiveSwift)
如何在这种情况下替换 RACSubject?
您将使用 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,总是“热”的,所以有一种特殊的 class 方法来创建可控信号。 Signal.pipe方式可以代替主语,将观察API和发送API分开,更好地表达意图。
要使用管道,根据需要在信号上设置观察器,然后将值发送到接收器:
let (signal, observer) = Signal<String, NoError>.pipe()
signal.observeValue(value in
// use value
})
observer.send(value: "the value")