2010-05-13 65 views
2

简化...常见的NSNotification错误?

建筑物有一个公寓对象的数组。每个公寓都有一个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]; 

有什么我可以得到根本上的错误吗?现在发生的事情是,公寓正在接收来自任何和所有currentTenants的通知,而不是它自己的。

对不起,实际的代码有点太难以发布。只是想知道在观察来自特定发件人的通知方面是否存在差距?

回答

3

关键位是在这里:

每间公寓遵守通知只能从它自己目前的租户(这是建立在公寓建成时,之前还有一个目前的租户)

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

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

当您使用nil一个s的对象参数,你告诉NSNotificationCenter你希望所有的PlumbingIssue警报传递给这位观察者。你需要做的是确保你只有在你有currentTennant时才设置通知。如果您使用的是物业,setCurrentTennant:可能是一个很好的选择。

一定要确保删除自己的观察者时currentTennant变化,始终确保删除你的对象作为观察员完全时,它的释放(或者NSNotificationCenter可以尝试发布通知解除分配的对象,这是一个非常坏事)。 - [NSNotifcationCenter removeObserver:]是最简单的方法。

+0

有趣。如果我可以保证在发布通知时总是有当前的Tenant? currentTenant频繁更改,但总是有一个。 – 2010-05-14 00:09:26

+1

通知发布时,但注册通知时无关紧要。如果当前租户为零,则您将注册所有可能发送租户的所有租户的所有PlumbingIssue通知。基本上,当房客入住时,注册他的通知;当他搬出去时,将他们从他们身上移开。 – 2010-05-14 02:24:32