Swift3 RACSubject迁移到ReactiveCocoa 5(Swift 3)

Swift3 RACSubject迁移到ReactiveCocoa 5(Swift 3),swift3,reactive-cocoa,reactive-cocoa-4,reactive-swift,reactive-cocoa-5,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() inte

我必须将应用程序从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不再出现在reactivecococoa 5(ReactiveSwift)中


在这种情况下,我如何替换RACSubject?

您将使用
管道
,它为您提供一个输入观察者和一个输出信号,而不是对输入和输出都使用
RACSubject
。看起来像这样:

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
let(信号,观察者)=信号管道()
信号
.map{string.uppercased()中的字符串]
.observeValues{打印值(值)}
send(值:“a”)//打印一个
send(值:“b”)//打印b
send(值:“c”)//打印c
使用Signal.pipe而不是RACSubject:

由于信号类型(如RACSubject)总是“热”,因此有一种特殊的类方法用于创建可控信号。Signal.pipe方法可以取代主题的使用,并通过将观察API与发送API分离来更好地表达意图

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

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

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

observer.send(value: "the value")
let(信号,观察者)=信号管道()
信号。观测值(单位为的值)
//使用价值
})
发送(值:“值”)

您可以使用
管道
,它为您提供一个输入观察者和一个输出信号,而不是对输入和输出都使用
RACSubject
。看起来像这样:

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
let(信号,观察者)=信号管道()
信号
.map{string.uppercased()中的字符串]
.observeValues{打印值(值)}
send(值:“a”)//打印一个
send(值:“b”)//打印b
send(值:“c”)//打印c
使用Signal.pipe而不是RACSubject:

由于信号类型(如RACSubject)总是“热”,因此有一种特殊的类方法用于创建可控信号。Signal.pipe方法可以取代主题的使用,并通过将观察API与发送API分离来更好地表达意图

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

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

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

observer.send(value: "the value")
let(信号,观察者)=信号管道()
信号。观测值(单位为的值)
//使用价值
})
发送(值:“值”)

我在ReactiveCocoa更改日志中找到了关于此问题的更具体参考。我在ReactiveCocoa更改日志中找到了关于此问题的更具体参考