让我解释一下,我在一个线程中有一个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])
它的工作
我愚蠢与否?!!
非常感谢
答案 0 :(得分:0)
这是因为通知中心没有这种方法,只有视图控制器才有。 通知中心只是一个将对象(如视图控制器)链接到特定通知的单例。它不响应选择器,只响应对象本身。
答案 1 :(得分:0)
你很困惑。它不会成为响应myCommandNotification:selector的通知中心,它将成为通知观察者。这是通知中心在检测到匹配的通知时将消息发送到的对象。
这一行:
if ([[NSNotificationCenter defaultCenter] respondsToSelector:selector])
毫无意义。
下一个问题:您设置通知以致电选择器myCommandNotification:
以获取名称为NetConnection
的通知(无论是什么。不应该以大写字母开头,但是让我们忽略它。)
接下来,您发布名称为myCommandNotification
的通知。您创建了观察者以收听名称为NetConnection
的通知,因此除非myCommandNotification
和NetConnection
都是包含相同值的字符串,否则您不会触发通知处理程序。
让我们假设您添加一个这样的观察者(为了清晰起见使用字符串常量)
[[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:
中指定的对象如何,我的观察者都会被调用。