Использовал ли Combine в продакшене
Что проверяют
Был ли у вас реальный опыт или только туториалы: в продакшене всплывают утечки подписок, обрыв цепочки после ошибки и выбор потока. Следом часто спрашивают, как Combine соотносится с async/await и где вы бы его сейчас не взяли.
Как отвечать
Каркас из личного опыта: какой проект, какие задачи, какие операторы, какие проблемы встретили и как решили. Типичные сценарии:
- поиск и формы:
@Publishedтекст поля, затемdebounce,removeDuplicatesиflatMapв запрос черезURLSession.dataTaskPublisher(for:); валидация формы черезcombineLatest; - связка с UI:
ObservableObjectс@Publishedдля SwiftUI илиsinkс обновлением UIKit послеreceive(on: DispatchQueue.main); - системные события:
NotificationCenter.default.publisher(for:),Timer.publish,CurrentValueSubjectкак хранилище состояния.
Покажите, что понимаете основы: подписка живёт, пока жив AnyCancellable, поэтому их складывают в Set<AnyCancellable>; наружу публикатор отдают через eraseToAnyPublisher(); для тестов подменяют планировщик.
Про сегодняшний контекст: Apple не объявляла Combine устаревшим, но новый код всё чаще пишут на Swift Concurrency, AsyncSequence и @Observable, а debounce для асинхронных последовательностей берут из пакета swift-async-algorithms. Хороший ответ называет, где Combine в вашем проекте остался оправданным.
Если в продакшене Combine не было, скажите это прямо и опирайтесь на смежное: RxSwift, где концепции почти один в один, или async/await. Объясните, как решили бы ту же задачу поиска.
Где спотыкаются
Не сохраняют AnyCancellable, и подписка отменяется сразу после создания. Запрос «иногда не приходит», хотя на деле его ответа никто не ждёт.
Не знают, что ошибка завершает поток навсегда. Поле поиска перестаёт работать после первого сетевого сбоя, если ошибку не перехватить через catch или replaceError внутри flatMap.
Ловят циклы удержания: sink захватывает self сильно, а assign(to:on:) с self удерживает объект. Помогают [weak self] и assign(to: &$property), появившийся в iOS 14.