В данной статье рассматривается реактивное программирование на примере RxSwift.
Реактивное программирование - это парадигма программирования, ориентированная на потоки данных и распространение изменений.
Реактивный стиль подразумевает, что наша программа является своего рода слушателем, который реагирует на изменения состояний объектов, за которыми он наблюдает.
Одно из самых основных понятие это понятие Observable. Наш наблюдаемый объект это и есть тот самый Observable, который асинхронно генерирует последовательность данных и позволяет другим объектам подписываться на эти последовательности. Так как есть наблюдаемый объект, логично что есть и наблюдатель, он же Subscriber.
Событие в RX, о котором Observable отправляет нам информацию, это перечисление с одним из трех возможных состояний:
- Next
- Error
- Completed
Когда присылается Next, вместе с ним приходит сам элемент, который мы передали, а также все посланные нами события. Событие Error приходит в случае ошибки. Completed в свою очередь присылается когда наш наблюдаемый объект завершил работу, отослав все данные. После получения события Error или Completed, объект больше не может генерировать никакую последовательность.
Пример:
let helloSequence = Observable.from(["H","e","l","l","o"])
let subscription = helloSequence.subscribe { event in
switch event {
case .next(let value):
print(value)
case .error(let error):
print(error)
case .completed:
print("completed")
}
}
H e l l o
completed
Для того, чтобы отменить подписку на изменения объекта, мы можем вызвать метод dispose. Так же можно добавить подписку в своего рода корзину - Disposebag. Эта "корзина" отменит подписку автоматически, при вызове метода deinit экземпляра Disposebag.
Scheduler является одной из самых важных составляющих RXSwift, благодаря ему мы можем запускать наши observable на разных потоках.
Существует два способа, как установить scheduler:
- observeOn
- subscribeOn
ObserveOn отвечает за то, в каком потоке будут обрабатываться принятые subscriber' ом события. Благодаря этому мы можем ставить загрузку данных. в background поток и при их получении перейти в main поток и влиять на UI.
SubscribeOn отвечает за то, в каком потоке будет происходить процесс observable до момента передачи его subscriber'у.
Пример:
sequence1
.observeOn(backgroundScheduler)
.map { n in
print("This is performed on the background scheduler")
}
.observeOn(MainScheduler.instance)
.map { n in
print("This is performed on the main scheduler")
}
Заключение
Данная статья была посвящена основам RXSwift. Реактивное программирование в Swift реализовано не только в библиотеке RXSwift, но данная библиотека является самой популярной и на мой взгляд простой для того, чтобы начать свой путь в реактивном подходе программирования на Swift.