iOS
Средний
Какие базовые операторы в Combine вы знаете?
Базовые операторы Combine
Трансформация:
map
[1, 2, 3].publisher
.map { $0 * 2 }
.sink { print($0) } // 2, 4, 6
flatMap
userIdPublisher
.flatMap { userId in
fetchUser(id: userId) // Возвращает Publisher
}
.sink { user in print(user) }
compactMap
["1", "two", "3"].publisher
.compactMap { Int($0) }
.sink { print($0) } // 1, 3
Фильтрация:
filter
[1, 2, 3, 4, 5].publisher
.filter { $0 > 2 }
.sink { print($0) } // 3, 4, 5
removeDuplicates
[1, 1, 2, 2, 3].publisher
.removeDuplicates()
.sink { print($0) } // 1, 2, 3
first / last
[1, 2, 3].publisher
.first()
.sink { print($0) } // 1
Комбинирование:
merge
let pub1 = [1, 2].publisher
let pub2 = [3, 4].publisher
pub1.merge(with: pub2)
.sink { print($0) } // 1, 2, 3, 4 (или смешанный порядок)
combineLatest
let name = CurrentValueSubject<String, Never>("Alice")
let age = CurrentValueSubject<Int, Never>(25)
name.combineLatest(age)
.sink { print("\($0), \($1)") }
// "Alice, 25"
name.send("Bob") // "Bob, 25"
zip
let letters = ["A", "B", "C"].publisher
let numbers = [1, 2, 3].publisher
letters.zip(numbers)
.sink { print("\($0)\($1)") } // A1, B2, C3
Тайминг:
debounce
searchText
.debounce(for: .milliseconds(300), scheduler: RunLoop.main)
.sink { text in search(text) }
throttle
scrollOffset
.throttle(for: .milliseconds(100), scheduler: RunLoop.main, latest: true)
.sink { offset in updateUI(offset) }
delay
publisher
.delay(for: .seconds(1), scheduler: RunLoop.main)
.sink { value in print(value) }
Обработка ошибок:
catch
fetchData()
.catch { error in
Just(fallbackData) // Замена при ошибке
}
.sink { data in use(data) }
retry
fetchData()
.retry(3) // Повторить до 3 раз
.sink { ... }
Scheduling:
publisher
.subscribe(on: DispatchQueue.global()) // Подписка в background
.receive(on: DispatchQueue.main) // Получение на main
.sink { value in updateUI(value) }
Похожие вопросы
Готовитесь к собеседованию?
ENIGMA AI — невидимый ИИ-помощник для технических интервью
Попробовать бесплатно