RACSubject迁移到ReactiveCocoa 5(Swift 3)

时间:2017-06-23 08:41:36

标签: swift3 reactive-cocoa reactive-cocoa-4 reactive-swift reactive-cocoa-5

我必须将应用程序从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主题?

1 个答案:

答案 0 :(得分:3)

您可以使用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)总是“热”,因此有一种特殊的类方法可用于创建可控信号。 Signal.pipe方法可以替代主题的使用,并通过将观察API与发送API分离来更好地表达意图。

要使用管道,请根据需要在信号上设置观察者,然后将值发送到接收器:

let (signal, observer) = Signal<String, NoError>.pipe()

signal.observeValue(value in
    // use value
})

observer.send(value: "the value")