iPhone - 为任何侦听器对象“在空中”发送消息

时间:2011-06-14 22:16:06

标签: iphone notifications message

是否有一种方法可以让一个对象在没有特定接收器对象的情况下发送消息,并转移到另一个对象中,听取可能带有对象(参数)的消息并执行所需的操作?

我在NSNotification附近搜索,但我看不到我应该做什么。

3 个答案:

答案 0 :(得分:1)

基本上,您向共享类NSNotificationCenter发布通知(NSNotification)。这是一个例子:

#define kNotificationCenter [NSNotificationCenter defaultCenter]
#define kNotificationToSend @"a notification name as a string"

//... Post the notification 

[kDefaultCenter postNotificationNamed:knotificationToSend withObject:nil];

任何想要倾听的课程,都会将自己作为观察者添加到通知中心。您也必须删除观察者。

[kNotificationCenter addObserver:self selector:@selector(methodToHandleNotification) object:nil];

//... Usually in the dealloc or willDisappear method:

[kNotificationCenter removeObserver:self];

您可以使用通知中心完成更多工作。请参阅the NSNotificationCenter documentation完整参考。

答案 1 :(得分:1)

想要收到通知的对象需要注册才能收到通知中心的通知。此后,当通知发布到通知中心时,通知中心将对所有已注册的过滤器进行检查,并对每个匹配过滤器采取相应的操作。

这种情况下的“过滤器”是(通知名称,通知对象)对。过滤器中的nil对象等同于任何对象(匹配时忽略通知对象)。该名称是必需的。

示例:

/* Subscribe to be sent -noteThis:
 * whenever a notification named @"NotificationName" is posted to the center
 * with any (or no) object. */
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(noteThis:)
           name:@"NotificationName"
         object:nil];

/* Post a notification. */
[nc postNotificationName:@"NotificationName" object:self userInfo:someDict];

/* Handle a notification. */
- (void)noteThis:(NSNotification *)note
{
   id object = [note object];
   NSDictionary *userInfo = [note userInfo];
   /* take some action */
}

有一个更现代的API使用队列和块,但我发现旧的API更容易说明和解释。

答案 2 :(得分:0)

我认为NSNotification是消息对象本身,要发送以收听发送的内容,请尝试NSNotificationCenter。它有一个单例对象,所以要发送消息:

NSNotification *notificationObj;
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center postNotification:notificationObj];

另一堂课听:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(method:) object:nil];

确保该类具有method:方法。您可以拥有一个参数,该参数是先前发送的NSNotification对象。 NSNotification对象具有[notificationObj object,您可以将其作为发件人类发送的一段数据获取。或者,如果您希望它更结构化,可以使用[notificationObj userInfo]

您可以初始化notificationObj并使用您想要的消息进行定制。有关NSNotificationCenter的更多信息,您可以找到它

http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html#//apple_ref/occ/cl/NSNotificationCenter

或有关NSNotification本身

的更多信息

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotification_Class/Reference/Reference.html