2

単純化...

建物にはアパート オブジェクトの配列があります。各アパートメントには単一の currentTenant があります。これらのテナントのタイプは Person です。currentTenant にはアパートメントへの参照がないため、情報をチェーンに戻すことができないことに注意してください。

テナントに配管の問題がある場合、テナントは NSNotification を発生させます。

[nc postNotificationName:@"PlumbingIssue" object:self];

各アパートメントは、それ自体の現在のテナントからのみ通知を監視します (これは、現在のテナントが存在する前に、アパートメントが構築されたときに設定されます)。

[nc addObserver:self selector:@selector(alertBuildingManager:) name:@"PlumbingIssue" object:[self currentTenant];

アパートメントは、自身の currentTenant から通知を受け取ると、自身の通知「PlumberRequired」をアパートメント番号と NSDictionary の currentTenant と共に送信します。

アパートメントは、任意のアパートメント (またはその他のオブジェクト) から受け取る次の通知を観察します。

[nc addObserver:self selector:@selector(callPlumber) name:@"PlumberRequired" object:nil];

ここで根本的に間違っている可能性があるものはありますか? 何が起こっているかというと、アパートは自分自身ではなく、すべての現在のテナントから通知を受け取っています。

申し訳ありませんが、実際のコードは投稿するには少し扱いに​​くいものです。特定の送信者からの通知を監視することについて、私の理解にギャップがあるかどうか疑問に思っていましたか?

4

1 に答える 1

3

キービットはここにあります:

各アパートメントは、それ自体の現在のテナントからのみ通知を監視します (これは、現在のテナントが存在する前に、アパートメントが構築されたときに設定されます)

がない場合currentTennant、コードは実際にこれを行っています:

[nc addObserver:self selector:@selector(alertBuildingManager:) name:@"PlumbingIssue" object:nil];

nilobject パラメーターとして使用すると、NSNotificationCenterすべてのPlumbingIssueアラートをこのオブザーバーに配信するように指定できます。あなたがする必要があるのは、あなたが持っているときだけ通知を設定することですcurrentTennant. プロパティを使用している場合は、setCurrentTennant:おそらくこれを行うのに適した場所です。

変更時には必ず自分自身をオブザーバーcurrentTennantとして削除し、オブジェクトの割り当てが解除された場合は常にオブザーバーとしてのオブジェクトを完全に削除してください (そうNSNotificationCenterしないと、割り当て解除されたオブジェクトに通知を投稿しようとする可能性がありますが、これは非常に悪いことです)。- [NSNotifcationCenter removeObserver:]それを行う最も簡単な方法です。

于 2010-05-13T14:09:20.680 に答える