【问题标题】:RACSubject migration to ReactiveCocoa 5 (Swift 3)RACSubject 迁移到 ReactiveCocoa 5 (Swift 3)
【发布时间】:2017-06-23 08:41:35
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您将使用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 方法可以替代 Subjects 的使用,通过将观察 API 与发送 API 分离,更好地表达意图。

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

    let (signal, observer) = Signal<String, NoError>.pipe()
    
    signal.observeValue(value in
        // use value
    })
    
    observer.send(value: "the value")
    

    【讨论】:

    猜你喜欢
    • 2017-02-01
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多