0

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

4

1 回答 1

3

您将使用pipewhich 为您提供一个输入观察者和一个输出信号,而不是使用 aRACSubject用于输入和输出。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:

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

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

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

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

observer.send(value: "the value")
于 2017-06-23T17:41:43.497 回答