0Pricing
Swift Academy · Урок

Публикация и наблюдение за уведомлениями

Отправляйте и получайте события во всём приложении.

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

NotificationCenter

NotificationCenter — это механизм широковещательных уведомлений: одна часть приложения отправляет уведомление, а любое количество наблюдателей реагирует на него, не зная друг о друге.

Центр по умолчанию

Большая часть кода использует NotificationCenter.default — общий центр, который маршрутизирует уведомления внутри процесса.

import Foundation

let center = NotificationCenter.default
print("Using the default notification center")

Определение имени уведомления

Уведомления идентифицируются с помощью Notification.Name. Определение константы предотвращает опечатки и хранит имя в одном месте.

import Foundation

extension Notification.Name {
    static let dataUpdated = Notification.Name("dataUpdated")
}
print("Defined a notification name")

Отправка уведомления

post(name:object:) рассылает уведомление. object обычно содержит отправителя или имеет значение nil.

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("ping")
center.post(name: name, object: nil)
print("Posted a notification")

Добавление наблюдателя (замыкание)

API на основе блока addObserver(forName:object:queue:using:) запускает замыкание каждый раз, когда срабатывает уведомление, и возвращает token.

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("ping")
let token = center.addObserver(forName: name, object: nil, queue: .main) { _ in
    print("Observer fired")
}
center.post(name: name, object: nil)
_ = token

Наблюдатели на основе селектора

Классический API использует целевой объект и #selector. Метод получает аргумент Notification.

import Foundation

class Watcher: NSObject {
    func start() {
        NotificationCenter.default.addObserver(
            self, selector: #selector(handle(_:)),
            name: Notification.Name("ping"), object: nil)
    }
    @objc func handle(_ n: Notification) { print("Handled") }
}
Watcher().start()

Получение уведомления

Замыкание или метод наблюдателя получает значение Notification, содержащее его имя, объект и userInfo.

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("event")
_ = center.addObserver(forName: name, object: nil, queue: nil) { note in
    print("Got: \(note.name.rawValue)")
}
center.post(name: name, object: nil)

Рассылка от одного отправителя многим получателям

Многие наблюдатели могут слушать одно и то же имя. Один вызов post уведомляет их всех.

import Foundation

let center = NotificationCenter.default
let name = Notification.Name("refresh")
_ = center.addObserver(forName: name, object: nil, queue: nil) { _ in print("A") }
_ = center.addObserver(forName: name, object: nil, queue: nil) { _ in print("B") }
center.post(name: name, object: nil)

Фильтрация по объекту

Передача ненулевого object в addObserver фильтрует уведомления: наблюдатель срабатывает только для отправлений от этого отправителя.

import Foundation

let center = NotificationCenter.default
let sender = NSObject()
let name = Notification.Name("scoped")
_ = center.addObserver(forName: name, object: sender, queue: nil) { _ in
    print("Only from sender")
}
center.post(name: name, object: sender)

Системные уведомления

Система отправляет множество встроенных уведомлений, например о событиях клавиатуры или жизненного цикла приложения. Наблюдать за ними можно тем же способом.

import Foundation

// e.g. UIApplication.didEnterBackgroundNotification on iOS
let custom = Notification.Name("appReady")
_ = NotificationCenter.default.addObserver(forName: custom, object: nil, queue: nil) { _ in
    print("App ready")
}

Когда это использовать

NotificationCenter подходит для глобальных событий по схеме «один — многим», когда отправитель и получатели должны оставаться независимыми. Для тесных связей один к одному часто понятнее delegate.

import Foundation

// Broadcast a global event many parts of the app care about.
let name = Notification.Name("userLoggedOut")
NotificationCenter.default.post(name: name, object: nil)
print("Broadcast logout")

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

Что делает NotificationCenter.default.post(name:object:)?

Повторение

NotificationCenter.default отделяет отправителей от получателей: вы определяете Notification.Name, отправляете его с помощью post, а затем добавляете наблюдателя через addObserver с замыканием или селектором. Поддерживаются рассылка от одного отправителя многим получателям и фильтрация по объекту. Далее: передача данных в userInfo.

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

Урок «Публикация и наблюдение за уведомлениями» бесплатный?

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

Чему я научусь в уроке «Публикация и наблюдение за уведомлениями»?

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

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

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

Сколько времени занимает урок «Публикация и наблюдение за уведомлениями»?

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

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

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

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

  1. Публикация и наблюдение за уведомлениями
  2. Полезные данные уведомлений userInfo
  3. Безопасное удаление наблюдателей
  4. Альтернативы шаблону наблюдателя
← Назад к Swift Academy