0Pricing
Swift Academy · Урок

PassthroughSubject и CurrentValueSubject

Используйте субъекты как мост между императивным кодом и конвейерами Combine.

«PassthroughSubject и CurrentValueSubject» — бесплатный урок Swift Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Добро пожаловать

Субъекты являются одновременно издателями и подписчиками. Они связывают императивный код с реактивными конвейерами Combine.

PassthroughSubject

```swift let subject = PassthroughSubject() subject.sink { print($0) }.store(in: &cancellables) subject.send("Hello") subject.send("World") // Hello, World ``` Подписчики, подключившиеся позднее, не получают ранее отправленные значения.

CurrentValueSubject

```swift let subject = CurrentValueSubject(0) subject.sink { print($0) }.store(in: &cancellables) // prints 0 immediately subject.value = 1 // prints 1 subject.value = 2 // prints 2 ``` Сохраняет текущее значение и передаёт его новым подписчикам.

PassthroughSubject и CurrentValueSubject

• `PassthroughSubject` — не хранит значение; поздние подписчики ничего не получают • `CurrentValueSubject` — хранит последнее значение; поздние подписчики получают его сразу

Отправка события завершения

```swift subject.send(completion: .finished) // or: subject.send(completion: .failure(MyError.bad)) ``` После завершения отправлять новые значения нельзя.

Использование в качестве издателя

```swift let events: AnyPublisher = subject.eraseToAnyPublisher() // Expose only the Publisher interface, hide Subject ```

Связь с делегатом

```swift class LocationManager: NSObject, CLLocationManagerDelegate { let locationSubject = PassthroughSubject() func locationManager(_ m: CLLocationManager, didUpdateLocations l: [CLLocation]) { locationSubject.send(l.last!) } } ```

Потокобезопасность

Субъекты по умолчанию не являются потокобезопасными. Отправляйте значения из одного и того же потока или используйте `receive(on:)` для переключения потока.

Тестирование с субъектами

```swift func testSearch() { let subject = PassthroughSubject() var results: [String] = [] subject.sink { results.append($0) }.store(in: &cancellables) subject.send("swift"); subject.send("ios") XCTAssertEqual(results, ["swift","ios"]) } ```

Combine в MVVM

```swift class SearchViewModel: ObservableObject { let querySubject = CurrentValueSubject("") @Published var results: [String] = [] init() { querySubject .debounce(for: 0.3, scheduler: RunLoop.main) .flatMap { search($0) } .assign(to: &$results) } } ```

Быстрая проверка

Какой субъект повторно передаёт своё текущее значение новым подписчикам?

Итоги

Основные выводы: • `PassthroughSubject` — не хранит значение и не повторяет его • `CurrentValueSubject` — хранит значение и повторно передаёт его поздним подписчикам • `send(completion:)` завершает поток • `eraseToAnyPublisher()` скрывает интерфейс субъекта • Субъекты связывают императивный и реактивный код Далее: сетевое взаимодействие с Combine.

Часто задаваемые вопросы

Урок «PassthroughSubject и CurrentValueSubject» бесплатный?

Да — полный текст урока «PassthroughSubject и CurrentValueSubject» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «PassthroughSubject и CurrentValueSubject»?

Используйте субъекты как мост между императивным кодом и конвейерами Combine. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «PassthroughSubject и CurrentValueSubject»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Издатели и подписчики
  2. Операторы: map, filter, combineLatest
  3. PassthroughSubject и CurrentValueSubject
  4. Сетевое взаимодействие с Combine и URLSession
← Назад к Swift Academy