试图理解NSNotification DefaultCenter多线程的概念

时间:2014-12-19 19:36:43

标签: ios objective-c ios8.1 conceptual

让我解释一下,我在一个线程中有一个UIViewController。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myCommandNotification:) name:NetConnection object:nil];

我在线程n +1中有另一个类,我发布了一条消息。

[[NSNotificationCenter defaultCenter] postNotificationName:myCommandNotification: object:MyObject];

好到目前为止没问题我很高兴哈哈。

嗯,是的,以后会有问题。

现在当我尝试使用

SEL selector = NSSelectorFromString([NSString stringWithFormat:@"%@:", myCommandNotification]); 

if ([[NSNotificationCenter defaultCenter] respondsToSelector:selector])

返回代码始终为NO。

当我使用

if ([MyViewController self] respondsToSelector:selector])

它的工作

我愚蠢与否?!!

非常感谢

2 个答案:

答案 0 :(得分:0)

这是因为通知中心没有这种方法,只有视图控制器才有。 通知中心只是一个将对象(如视图控制器)链接到特定通知的单例。它不响应选择器,只响应对象本身。

答案 1 :(得分:0)

你很困惑。它不会成为响应myCommandNotification:selector的通知中心,它将成为通知观察者。这是通知中心在检测到匹配的通知时将消息发送到的对象。

这一行:

if ([[NSNotificationCenter defaultCenter] respondsToSelector:selector])

毫无意义。

下一个问题:您设置通知以致电选择器myCommandNotification:以获取名称为NetConnection的通知(无论是什么。不应该以大写字母开头,但是让我们忽略它。)

接下来,您发布名称为myCommandNotification的通知。您创建了观察者以收听名称为NetConnection的通知,因此除非myCommandNotificationNetConnection都是包含相同值的字符串,否则您不会触发通知处理程序。

让我们假设您添加一个这样的观察者(为了清晰起见使用字符串常量)

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

然后发布观察者会响应的通知,它将如下所示:

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

请注意,在两种情况下,通知NAME都是相同的字符串。如果在添加观察者时提供特定对象,则只会调用通知,其对象参数与​​您在调用addObserver:selector:name:object:时指定的对象相匹配。我的示例我添加了一个观察者,但提供了一个nil对象参数,因此无论调用postNotificationName:object:中指定的对象如何,我的观察者都会被调用。