ENIGMA AI
ENIGMA AI
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 — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы