2011-08-02 38 views
0

我在名为Test的A类中有一个NSNotification观察者。观察者调用一个方法,checker:NSNotificationCenter:我怎么知道发布通知的内容?

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

然后我在B级和C两个职位,既命名观察者测试

[[NSNotificationCenter defaultCenter] postNotificationName:@"Test" object:self]; 

我希望能够知道哪些职位是被发送到观察者和递增计数器是在检查方法可用,是这样的:

-(void)check { 
    if ([classB count] <= [classC count]) { 
     NSLog(@"boom"); 
    } 
} 

我见过的建议,使用用户信息这样做,但即时通讯不太清楚如何;在计数器对象类B/C实例化,并以int词典等

任何帮助,不胜感激传递 感谢

回答

2

那么你需要让你在A级反比你能做到这一点的检查:功能

- (void)checker:(NSNotification *)notification 
{ 
    if ([notification.object isKindOfClass:[BClass class]]) { 
     bCounter++; 
    } 
    else if ([notification.object isKindOfClass:[CClass class]]) { 
     cCounter++; 
    } 

    if (bCounter < cCounter) { 
     NSLog(@"boom"); 
    } 
} 

让我知道它是否适合你。

+0

我认为这是我正在寻找的,我会让你知道它是如何结果。谢谢! – Elmo

+0

我会接受这个COS它几乎是我寻找的:) Theres只是一件令人讨厌的事情,我不知道它只是我有一个愚蠢的一天,但是当我在ClassA中声明bCounter和cCounter全球时,他们似乎给我离谱的数字,而不是从0开始。对于如何保留柜台数量,你也有任何建议吗?当应用程序重新启动时,它们会返回0或任何其他值。 正如我所说即时通讯有一个愚蠢的一天:) – Elmo

+0

@Elmo:在C中,如果你声明了一个变量并且不给它赋值,那么它将只有当时在内存中发生的任何值。与Java不同,C不会为您清理。 (除了对象实例变量,当实例被分配时它们被清除为零。)为你的全局变量尝试'static int bCounter = 0;'。 – benzado

1

对于如何通过用户信息字典,你可以访问How to pass userInfo in NSNotification?

你能做的是,可以在定义了检查方法的类中有两个类级别的变量,然后根据使用userInfo字典中包装的通知对象发送的标识符,可以递增countClassB和countClassC的值。

+0

酷我会研究它。感谢您的快速回复:) – Elmo

0

您也可以分别在b和c类中实现增量方法。然后在你的测试方法中调用increment方法,即[notification.object increment]。这样你就不必关心对象的实际类。要获得b或c的实际计数器,可以使用属性(即在a类中,您可以要求b.counter或c.counter)。