Большая часть нашего кода включает в себя обработку событий, связанных с элементами интерфейса. Когда пользователь взаимодействует с элементом управления, мы должны написать обработчик @IBAction для реагирования на действия пользователя. Нам нужно подписаться на уведомления, чтобы отслеживать изменения положения клавиатуры. Когда URL sessions возвращают данные, нам необходимо предоставить исполняемый блок. Мы используем KVO для отслеживания изменений переменных. Все эти механизмы делают наш код излишне сложным. Есть ли что-то лучше, чем использование одного механизма для обработки всех запросов и ответов? Именно здесь на помощь приходит Rx.
RxSwift — это реализация официальных Reactive Extensions (также известных как Rx), которые поддерживают множество языковых платформ.
Каждый экземпляр Observable представляет собой очередь. Основное преимущество Observable по сравнению с Swift SequenceType заключается в том, что он всё ещё может принимать асинхронные элементы, и это является основой RxSwift. Всё остальное строится на этом фундаменте.
ObservableType
) эквивалентен SequenceType
.ObservableType.subscribe(_:)
метод эквивалентен SequenceType.generate()
.ObservableType.subscribe(_:)
требует наблюдателя (ObserverType
) в качестве параметра, который автоматически подписывается на события, генерируемые Observable, вместо ручного использования метода Next()
для подписки на обратные вызовы.Если Observable генерирует событие next
(Event.next(Element)
), он может продолжать генерировать больше событий. Однако если он генерирует ошибку (Event.error(ErrorType)
) или завершает работу (Event.completed
), он больше не сможет отправлять события подписчикам.
Вот более краткое изложение этой концепции:
next* (error | completed)?
Графики могут помочь объяснить это более наглядно:
--1--2--3--4--5--6--|----> // "|" = нормальная остановка
--a--b--c--d--e--f--X----> // "X" = остановка при ошибке
--tap--tap----------tap--> // "|" = никогда не останавливается, например, очередь событий нажатия кнопки
Эти графики называются диаграммами мраморного камня. Вы можете узнать больше на сайте RxMarbles.com.
Наблюдаемые объекты и наблюдатели (также называемые подписчиками)
Объекты, которые можно подписать (Observables), не будут выполнять свои блоки подписки до тех пор, пока у них не появятся подписчики. В следующем примере блок никогда не будет выполнен, потому что у него нет подписчиков:
example("Observable with no subscribers") {
_ = Observable<String>.create { observerOfString -> Disposable in
print("This will never be printed")
observerOfString.on(.next("😬"))
observerOfString.on(.completed)
return Disposables.create()
}
}
В следующем примере блок будет выполняться при подписке (subscribe(_:)
):
example("Observable with subscriber") {
_ = Observable<String>.create { observerOfString in
print("Observable created")
observerOfString.on(.next("😉"))
observerOfString.on(.completed)
return Disposables.create()
}
.subscribe { event in
print(event)
}
}
Не беспокойтесь о том, как создаются Observables, мы рассмотрим это в следующей главе.
Метод subscribe(_:)
возвращает экземпляр Disposable
, представляющий собой одноразовый ресурс, такой как подписка. Он был проигнорирован в предыдущем простом примере, но часто используется правильно. Это означает, что его следует поместить в экземпляр DisposeBag
, чтобы он обрабатывался должным образом. В последующих примерах мы будем включать соответствующую обработку, поскольку практика — лучший способ обучения!
Вы можете узнать больше о Disposing
в разделе «Введение» на GitHub.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )