Миграция 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")