Публикация и наблюдение за уведомлениями
Отправляйте и получайте события во всём приложении.
«Публикация и наблюдение за уведомлениями» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Публикация и наблюдение за уведомлениями
- Полезные данные уведомлений userInfo
- Безопасное удаление наблюдателей
- Альтернативы шаблону наблюдателя