Для чего используются фреймворки Combine и RxSwift?

«Для чего используются фреймворки Combine и RxSwift?» — вопрос из категории Реактивное программирование, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Combine (от Apple) и RxSwift (сторонний) — это фреймворки для реактивного программирования. Они предоставляют абстракцию для работы с асинхронными потоками данных и событиями.

Основные цели:

  1. Управление асинхронностью: Упрощение кода для сетевых запросов, таймеров, обработки пользовательского ввода.
  2. Декларативный стиль: Описание цепочки преобразований над данными (например, фильтрация, преобразование, объединение).
  3. Управление памятью и жизненным циклом: Автоматическая отмена подписок при деинициализации объекта.

Пример на Combine:

import Combine

class SearchViewModel {
    @Published var searchText = ""
    private var cancellables = Set<AnyCancellable>()

    init() {
        $searchText
            .debounce(for: .milliseconds(300), scheduler: RunLoop.main) // Ждем окончания ввода
            .removeDuplicates() // Игнорируем повторяющиеся значения
            .map { text -> URL? in // Преобразуем текст в URL запроса
                return URL(string: "https://api.example.com/search?q=(text)")
            }
            .compactMap { $0 } // Отфильтровываем nil
            .flatMap { url in // Выполняем сетевой запрос
                URLSession.shared.dataTaskPublisher(for: url)
                    .map(.data)
                    .decode(type: [SearchResult].self, decoder: JSONDecoder())
                    .catch { _ in Just([]) } // При ошибке возвращаем пустой массив
            }
            .assign(to: .results, on: self) // Обновляем свойство results
            .store(in: &cancellables) // Управляем жизненным циклом подписки
    }
}

Выбор между ними:

  • Combine: Нативный фреймворк Apple, доступен с iOS 13+. Интегрирован с SwiftUI.
  • RxSwift: Поддерживает более старые версии iOS, имеет больше операторов и сообщество. Используется в кроссплатформенных проектах (есть порты для других языков).