简化...

建筑物中有一系列公寓对象。每个公寓都有一个currenttenant。这些租户属于“人”类型。请注意,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];


我在这里可能会从根本上犯错吗?发生的情况是该公寓正在接收来自所有currentTenant的通知,而不是自己拥有。

抱歉,实际代码过于笨拙,无法发布。我只是想知道我在观察特定发件人的通知方面是否存在差距?

最佳答案

关键在这里:


  每个公寓仅从其自己的当前租户观察通知(这是在公寓建成时,在没有当前租户之前设置的)


如果没有currentTennant,则您的代码实际上正在执行此操作:

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


当使用nil作为对象参数时,您告诉NSNotificationCenter您希望将所有PlumbingIssue警报传递给该观察者。您需要做的是确保只有在拥有currentTennant时才设置通知。如果使用的是属性,则setCurrentTennant:可能是执行此操作的好地方。

确保确保在currentTennant发生更改时将自己作为观察者删除,并且始终确保在对象被释放后将其作为观察者完全删除(否则NSNotificationCenter可能会尝试将通知发布到已释放对象,这是非常重要的。坏事)。 - [NSNotifcationCenter removeObserver:]是最简单的方法。

07-27 22:03