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,它为您提供输入观察器和输出信号,而不是对输入和输出都使用 RACSubjectThe 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")