Ответ
Driver — это специальный тип последовательности (Observable) в RxSwift, спроектированный для безопасного связывания с UI.
Ключевые гарантии Driver:
- Не генерирует ошибки (No errors). Если исходная последовательность завершается с ошибкой, Driver преобразует ее в другие события.
- Наблюдение происходит на главном потоке (Main scheduler). Избегает необходимости вручную вызывать
.observeOn(MainScheduler.instance). - Разделение ресурсов (Sharing). Имеет поведение
share(replay: 1, scope: .whileConnected), предотвращая повторное выполнение side-эффектов при нескольких подписчиках.
Типичный use case — привязка текстового поля к списку результатов:
let searchDriver = searchTextField.rx.text.orEmpty
.asDriver() // Преобразуем ControlProperty в Driver
.debounce(.milliseconds(300)) // Добавляем задержку
.distinctUntilChanged() // Игнорируем повторяющиеся значения
// Безопасная привязка к таблице
searchDriver
.drive(tableView.rx.items(cellIdentifier: "Cell")) { index, query, cell in
cell.textLabel?.text = query
}
.disposed(by: disposeBag)
// Безопасная привязка к лейблу счетчика
searchDriver
.map { "По запросу найдено: ($0.count) символов" }
.drive(countLabel.rx.text)
.disposed(by: disposeBag)
Почему это важно?
- Безопасность: Все обновления UI гарантированно выполняются на главном потоке.
- Удобство: Избавляет от шаблонного кода для обработки ошибок и управления потоками.
- Эффективность: Side-эффекты (например, сетевой запрос) выполняются один раз для всех подписчиков.