【问题标题】:iPhone - testing if a notification existsiPhone - 测试通知是否存在
【发布时间】:2010-09-26 21:16:29
【问题描述】:

在代码中的某个时刻,可能会添加类似的内容

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSomething) name:@"Hello" object:nil];   

如何测试此通知是否已在队列中处于活动状态或已被删除,以防止添加重复?

谢谢。

【问题讨论】:

标签: iphone


【解决方案1】:

如果您的意思是“测试您是否已经注册为通知的观察者”,我认为除了发布通知并看到您收到回调(可能会产生灾难性影响)之外,没有其他简单的方法。

如果有双重添加的危险,我通常在添加之前使用[[NSNotificationCenter defaultCenter] removeObserver:self name:foo object:bar]

注册通知不会发生在队列中。

【讨论】:

  • 在不知道是否有要移除的观察者的情况下移除观察者不是很危险吗?不像释放一个已经释放的对象吗?这不会导致应用崩溃吗?
  • @数字机器人;我一直这样做。它不会崩溃。
  • 1.它不像双重释放/双重释放,因为 NSNotificationCenter 不保留“目标”或“对象”(大概它保留了“名称”)。 2. NSNotificationCenter 跟踪 (target,selector,name,object) 元组。它必须这样做,因为当您调用 removeObserver: 或 removeObserver:name:object: 时,它必须知道要删除什么。 3. "remove" 方法一般意味着"如果没有被添加就不要做任何事情(例如-[NSMutableSet removeObjectForKey:], -[NSArray removeObject:])
  • 在移除和添加观察者之间是否存在竞争条件,其中可能会触发通知并且无法触发观察者?
【解决方案2】:

在添加之前移除观察者:

How to avoid adding multiple NSNotification observer?

对于单元测试,您应该模拟 NSNotificationCenter,因为它是依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2011-02-16
    相关资源
    最近更新 更多