0Pricing
Swift Academy · レッスン

通知の投稿と監視

アプリ全体のイベントを送受信します。

「通知の投稿と監視」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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")

オブザーバーを追加する(クロージャ)

ブロックベースのaddObserver(forName:object:queue:using:)は、通知が発生するたびにクロージャを実行し、トークンを返します。

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()

通知を受け取る

オブザーバーのクロージャまたはメソッドは、通知の名前、オブジェクト、userInfoを含むNotification値を受け取ります。

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)

1対多のブロードキャスト

複数のオブザーバーが同じ名前の通知を監視できます。1回の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)

オブジェクトでフィルタリングする

addObserverにnil以外のobjectを渡すと、オブザーバーはその送信元からの通知に対してのみ実行されます。

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は、送信元と受信側を疎結合に保ちたい、グローバルな1対多のイベントに適しています。密接な1対1の関係には、デリゲートのほうが明確なことがよくあります。

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で反応します。1対多のブロードキャストとオブジェクトによるフィルタリングに対応しています。次はuserInfoでデータを渡す方法です。

よくある質問

「通知の投稿と監視」レッスンは無料ですか?

はい。「通知の投稿と監視」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「通知の投稿と監視」で何を学びますか?

アプリ全体のイベントを送受信します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「通知の投稿と監視」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 通知の投稿と監視
  2. NotificationのuserInfoペイロード
  3. オブザーバーの安全な削除
  4. Observerパターンの代替手段
← Swift Academyに戻る