通知の登録
あなたは自分自身のアプリケーションや他のアプリケーションの中から通知のために登録することができます。前者のためには ローカル通知の登録 を参照し、後者のためには 分散通知の登録 を参照してください。オブジェクトの割り当てが解除されたときに行わなければならない通知を登録解除するには、監視者の登録解除 を参照してください。
ローカル通知の登録
通知センターメソッドの addObserver:selector:name:object: を呼び出すことによって、通知を受け取るオブジェクトを登録します。監視者、通知センターが監視者に送信すべきメッセージ、受け取りたい通知の名前、またどのオブジェクトについてかをを指定します。名前とオブジェクトの両方を指定する必要はありません。オブジェクトのみを指定すると、監視者はそのオブジェクトを含むすべての通知を受け取ります。通知名のみを指定すると、監視者は、関連するオブジェクトに関係なく、通知が送信されるたびにその通知を受け取ります。
監視者を、同じ通知のために 1 つ以上のメッセージを受信するために登録することができます。このような場合、監視者は、通知のために受信登録されたすべてのメッセージを受信しますが、それを受信する順序は判別できません。
後で監視者が通知を受け取る必要がなくなったと判断した場合 (例えば監視者の割り当てが解除する場合など)、removeObserver: または removeObserver:name:object: メソッドを使用して、監視者を通知センターの監視者のリストから削除できます。
通常、プロセスのデフォルト通知センターにオブジェクトを登録します。defaultCenter クラス・メソッドを使用して、デフォルトのオブジェクトを取得して下さい。
通知センターを使用して通知を受信する例として、ウィンドウがメインになるたびに (たとえば、インスペクタパネル用のコントローラを実装している場合など) いつでも操作を実行したいとします。以下の例に示すように、クライアントオブジェクトを監視者として登録します。
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(aWindowBecameMain:) name:NSWindowDidBecomeMainNotification object:nil];
オブジェクトとして nil を渡すことで、オブジェクトが NSWindowDidBecomeMainNotification 通知を送信すると、クライアントオブジェクト (self) に通知されます。
ウィンドウがメインになると、NSWindowDidBecomeMainNotification が通知センターに送信されます。通知センターは、addObserver:selector:name:object: の selector 引数で指定したメソッドを呼び出すことによって、通知に関心のあるすべての監視者に通知します。この例の監視者の場合、selector は aWindowBecameMain: です。 aWindowBecameMain: メソッドの実装は以下のとおりです。
- (void)aWindowBecameMain:(NSNotification *)notification { NSWindow *theWindow = [notification object]; MyDocument = (MyDocument *)[[theWindow windowController] document]; // Retrieve information about the document and update the panel. }
NSWindow オブジェクトはインスペクタパネルについて何も知る必要はありません。
分散通知の登録
オブジェクトは、addObserver:selector:name:object:suspensionBehavior: メソッドを NSDistributedNotificationCenter オブジェクトに送信して通知を受け取るように登録し、通知を送信するメッセージ、受信する通知の名前、一致する文字列 (object 引数) 、また通知の配信が中断された場合に実行される動作を指定します。
送信オブジェクトと監視者は異なるプロセスにある可能性があるため、通知に任意のオブジェクトへのポインタを含めることはできません。したがって、NSDistributedNotificationCenter クラスでは、NSString オブジェクトを object 引数として使用するための通知が必要です。通知の照合は、オブジェクトポインタではなく、この文字列に基づいて行われます。通知を送信するオブジェクトの文書を調べて、その文字列を識別する文字列として使用するかどうかを確認する必要があります。
プロセスが通知をすぐに受信することに関心がなくなった場合、プロセスは通知の配信を中断することがあります。これは、アプリケーションが隠されている、またはバックグラウンドに置かれているときによく行われます。(NSApplication オブジェクトは、アプリケーションがアクティブでないときに自動的に配信を中断します。) addObserver メソッドの suspensionBehavior 引数は、配信が中断されている間に到着した通知を処理する方法を識別します。4 つの異なる型の中断動作があり、それぞれ異なる状況で役立ちます。
中断動作 | 説明 |
NSNotificationSuspensionBehaviorDrop | サーバーは、setSuspended:NO メッセージを受け取るまで、この名前とオブジェクトの通知を一切キューに入れません。 |
NSNotificationSuspensionBehaviorCoalesce | サーバーは、指定された名前とオブジェクトの最後の通知のみをキューに入れます。以前の通知は破棄されます。中断動作が明示的な引数ではないカバーメソッドでは、 NSNotificationSuspensionBehaviorCoalesce がデフォルトです。 |
NSNotificationSuspensionBehaviorHold | サーバーは、キューが一杯になるまで (キュー・サイズはサーバーによって決定される)、サーバーがキューに入れた通知をフラッシュするまで、一致するすべての通知を保持します。 |
NSNotificationSuspensionBehaviorDeliverImmediately | サーバーは、setSuspended:YES メッセージを受信したかどうかにかかわらず、この登録と一致する通知を配信します。この中断動作の通知が一致すると最初に、キューに入れられた通知がフラッシュされます。結果は、サーバーが setSuspended:NO を受信したかのようになり、アプリケーションが中断している間に、問題の通知が配信された後、前回の中断または中断されていない状態に移行します。 |
分散通知センターに setSuspended:YES を送信して通知を中断します。通知が中断されている間、通知サーバーは、通知を受信するために登録した監視者によって指定された中断動作に従って、通知配信を中断したプロセス宛ての通知を処理します。プロセスが通知配信を再開すると、キューに入れられたすべての通知がすぐに配信されます。 Application Kit を使用するアプリケーションでは、NSApplication オブジェクトは、アプリケーションがアクティブでないときに通知配信を自動的に中断します。
NSNotificationSuspensionBehaviorDeliverImmediately で登録された監視者宛の通知は、配信されるとキューを自動的にフラッシュし、キューに入れられたすべての通知がその時点で配信されることにも注意してください。
中断状態は、通知のポスターによって上書きすることができます。サーバーがシャットダウンされたという警告などの通知が緊急の場合、通知は NSDistributedNotificationCenter postNotificationName:object:userInfo:deliverImmediately: メソッドで deliverImmediately 引数を YES にして通知を送信することによって、すべての監視者に即時に配信されます。
監視者の登録解除
通知を監視しているオブジェクトが割り当て解除される前に、通知センターに通知の送信を停止するように指示しなければなりません。そうしないと、存在しないオブジェクトに次の通知が送信され、プログラムがクラッシュします。登録されているオブジェクトと通知の数に関係なく、ローカル通知の監視者としてオブジェクトを完全に削除するには、以下のメッセージを送信できます。
[[NSNotificationCenter defaultCenter] removeObserver:self];
分散通知の監視者では以下のように送信します:
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
特定の通知のためにオブジェクトを選択的に登録解除するには、通知名と監視対象オブジェクトを指定する、より具体的な removeObserver... メソッドを使用します。