代码之家  ›  专栏  ›  技术社区  ›  Ben Packard Ross Knipe

常见的nsnotification错误?

  •  2
  • Ben Packard Ross Knipe  · 技术社区  · 16 年前

    简化…

    一个建筑物有一系列公寓对象。每个公寓都有一个当前租户。这些房客都是典型的人。请注意,当前租户没有对公寓的引用,因此无法向上发送信息链。

    当租户出现管道问题时,他会发出一个nsnotification:

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

    每个公寓只观察来自其当前租户的通知(这是在公寓建立时,在当前租户存在之前设置的):

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

    当公寓收到自己当前租户的通知时,它会发送自己的通知“PlumberRequired”,以及NSDictionary中的公寓编号和当前租户。

    公寓观察这些通知,它将从任何公寓(或其他对象)接收这些通知:

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

    这里有什么我可能根本就弄错的地方吗?现在的情况是,这套公寓正在接收来自任何和所有现有租户的通知,而不是它自己的通知。

    很抱歉,实际的代码太难发布了。只是想知道我对观察某个特定发件人的通知的理解是否存在差距?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Alex    16 年前

    关键点在这里:

    每个公寓只观察来自其当前租户的通知(这是在公寓建立时,在当前租户存在之前设置的)

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

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

    当你使用 nil 作为对象参数, NSNotificationCenter 你想要一切 PlumbingIssue 向该观察员发送警报。您需要做的是确保只有在 正伦坦 . 如果你在使用属性, setCurrentTennant: 可能是个好地方。

    在下列情况下,一定要以观察员的身份离开 正伦坦 更改,并始终确保在解除分配对象(或 通知中间 可能会尝试向已释放的对象发送通知,这是非常糟糕的事情)。 - [NSNotifcationCenter removeObserver:] 这是最简单的方法。