常见的NSNotification错误?

时间:2010-05-13 13:52:13

标签: objective-c cocoa nsnotifications

简化......

建筑物有一系列公寓物品。每间公寓都有一个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];

我在这里可能会遇到根本错误吗?发生的事情是,公寓正在接收来自任何和所有当前租户的通知,而不是它自己的通知。

很抱歉,实际的代码有点过于笨重,无法发布。只是想知道我对观察来自特定发件人的通知的理解是否存在差距?

1 个答案:

答案 0 :(得分:3)

关键位在这里:

  

每间公寓仅通过其当前租户观察通知(这是在公寓建成时设置的,在有当前租户之前设置)

如果没有currentTennant,那么您的代码实际上是这样做的:

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

当您使用nil作为对象参数时,您告诉NSNotificationCenter您希望向此观察者发送所有PlumbingIssue个警报。您需要做的是确保仅在拥有currentTennant时设置通知。如果您正在使用属性,setCurrentTennant:可能是一个很好的地方。

确保在currentTennant更改时以观察者身份移除自己,并始终确保在解除分配后将对象完全删除为观察者(否则NSNotificationCenter可能会尝试将通知发布到解除分配的对象,这是一件非常糟糕的事情。 - [NSNotifcationCenter removeObserver:]是最简单的方法。