← Назад к вопросам

Какие знаешь операторы в RxSwift?

2.2 Middle🔥 141 комментариев
#Архитектура и паттерны#Многопоточность и асинхронность

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Операторы в RxSwift

RxSwift содержит обширную библиотеку операторов (operators), которые позволяют трансформировать, комбинировать, фильтровать и манипулировать потоками данных (Observable sequences). Эти операторы — мощный инструмент для реактивного программирования, обеспечивающий декларативный и выразительный способ работы с асинхронными потоками событий.

Основные категории операторов

1. Создание последовательностей (Creating Observables)

Эти операторы создают новые Observable из различных источников:

  • just: Создает последовательность из одного элемента и завершается.
    Observable.just("Hello")
    
  • from: Создает последовательность из массива или коллекции.
    Observable.from([1, 2, 3])
    
  • of: Аналогичен from, но принимает variadic параметры.
    Observable.of(1, 2, 3)
    
  • create: Позволяет вручную реализовать логику эмита событий.
    Observable.create { observer in
        observer.onNext(1)
        observer.onCompleted()
        return Disposables.create()
    }
    
  • deferred: Откладывает создание Observable до подписки.
  • interval: Генерирует последовательность чисел с заданным интервалом.
  • timer: Создает последовательность с задержкой.

2. Преобразование (Transforming)

Изменяют элементы, эмитируемые Observable:

  • map: Преобразует каждый элемент.
    observable.map { value in value * 2 }
    
  • flatMap: Преобразует каждый элемент в новый Observable и объединяет их.
  • compactMap: Аналог map с игнорированием nil значений (полезно для опционалов).
  • scan: Накопление результата, подобно reduce, но с эмитом каждого промежуточного значения.

3. Фильтрация (Filtering)

Выбирают определенные элементы из последовательности:

  • filter: Пропускает только элементы, удовлетворяющие условию.
    observable.filter { $0 > 10 }
    
  • distinctUntilChanged: Игнорирует повторяющиеся подряд элементы.
  • take: Берет только первые N элементов.
  • skip: Пропускает первые N элементов.
  • debounce: Эмитит элемент только после паузы в потоке (полезно для поиска).

4. Комбинирование (Combining)

Объединяют несколько Observable:

  • merge: Объединяет несколько Observable в один.
  • concat: Подписывается на следующий Observable после завершения предыдущего.
  • zip: Комбинирует элементы нескольких Observable попарно.
    Observable.zip(obs1, obs2) { $0 + $1 }
    
  • combineLatest: Эмитит последние значения из каждого источника при любом изменении.
  • withLatestFrom: При эмите в основном Observable, добавляет последнее значение из второго.

5. Обработка ошибок (Error Handling)

Управляют ошибками в последовательностях:

  • catchError: Перехватывает ошибку и переключается на backup Observable.
  • retry: Повторяет подписку при ошибке указанное количество раз.
  • materialize / dematerialize: Преобразуют события в элементы и обратно.

6. Работа с временем (Time-based)

  • throttle: Ограничивает частоту эмитов (в отличие от debounce, эмитит первый или последний элемент в интервале).
  • timeout: Завершает последовательность с ошибкой, если нет событий в заданный период.

7. Утилиты (Utility)

  • subscribe: Подписка на события (next, error, completed).
  • do: Выполняет side-эффекты без изменения потока (логирование, отладка).
    observable
        .do(onNext: { print("Эмит: \($0)") })
        .subscribe()
    
  • delay: Задерживает эмит элементов на указанное время.
  • share / share(replay:): Делает Observable горячим и делится подписками (важно для предотвращения дублирования работы).

8. Работа с субъектами (Subjects)

Хотя Subject — это одновременно Observable и Observer, они часто используются как операторы управления:

  • PublishSubject: Эмитит элементы только после подписки.
  • BehaviorSubject: Хранит текущее значение и эмитит его новым подписчикам.
  • ReplaySubject: Кэширует указанное количество элементов для новых подписчиков.

Важные особенности

  • Цепочки операторов (Operator chaining): Операторы можно объединять в цепочки, создавая сложные трансформации в декларативном стиле.
  • Ленивые вычисления (Lazy evaluation): Большинство операторов не выполняют работу, пока на Observable не подпишутся.
  • Композиция (Composition): Операторы можно комбинировать для создания собственных, более сложных операторов.

Эти операторы образуют мощный DSL (Domain Specific Language) для работы с асинхронными потоками, позволяя писать чистый, поддерживаемый и тестируемый код. Понимание их категорий и назначения критически важно для эффективного использования RxSwift в iOS-разработке.