简化......
建筑物有一系列公寓物品。每间公寓都有一个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];
我在这里可能会遇到根本错误吗?发生的事情是,公寓正在接收来自任何和所有当前租户的通知,而不是它自己的通知。
很抱歉,实际的代码有点过于笨重,无法发布。只是想知道我对观察来自特定发件人的通知的理解是否存在差距?
答案 0 :(得分:3)
关键位在这里:
每间公寓仅通过其当前租户观察通知(这是在公寓建成时设置的,在有当前租户之前设置)
如果没有currentTennant
,那么您的代码实际上是这样做的:
[nc addObserver:self selector:@selector(alertBuildingManager:) name:@"PlumbingIssue" object:nil];
当您使用nil
作为对象参数时,您告诉NSNotificationCenter
您希望向此观察者发送所有PlumbingIssue
个警报。您需要做的是确保仅在拥有currentTennant
时设置通知。如果您正在使用属性,setCurrentTennant:
可能是一个很好的地方。
确保在currentTennant
更改时以观察者身份移除自己,并始终确保在解除分配后将对象完全删除为观察者(否则NSNotificationCenter
可能会尝试将通知发布到解除分配的对象,这是一件非常糟糕的事情。 - [NSNotifcationCenter removeObserver:]
是最简单的方法。