Миграция RACSubject в ReactiveCocoa 5 (Swift 3)

Мне нужно перенести приложение из ReactiveCocoa 4 в ReactiveCocoa 5 (из-за миграции Swift 3)

Старая реализация использует несколько экземпляров RACSubject для запуска (executeOperationSubject.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 в этом контексте?

1 ответ

Решение

Вы бы использовали pipe который дает вам входной наблюдатель и выходной сигнал вместо использования RACSubject для ввода и вывода. Пример из документов 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")
Другие вопросы по тегам