问题:
想在APP中发布一条通知,同时允许其他对象接收通知并根据你广播的内容采取相应的行动.
讨论:
通知中心是通知对象的派送中心, 例如,在用户使用 App 时如果键盘显示出来了,iOS 会发送一条通知到你的应用,程序中的任何对象都可以通过将自己添加到通知中心,作为一个观察者,来监听此通知。当对象的的生命周期即将结束时,需要将该对象从通知中心的派送表中移除。
这样,一条通知就相当于一个消息被通知中心广播给它的观察者。通知中心是 NSNotificationCenter 类的一个实例对象。我们通过 NSNotificationCenter 的 defaultCenter 类的实例方法获取系统默认的通知中心实例;
通知本身就是 NSNotification 类的对象。一条通知对象有一个名称(标记为 NSString),它可以携带 2 条重要信息:(注意:你可以不需要使用 API 就给自己的通知命名,只要确保此条通知命名足够特别到不会与系统信息冲突.)
发送者:
发送者就是消息的发起对象.观察者可以通过NSNotification类的object方法获得发送者.
用户信息字典:
这是一个可选项字典。这个字典通常包含关于此条通知的更多信息。
例如,当键盘在程序中显示出来时,iOS 会发送一个 UIKeyboardWillShowNotification 通知到通知中心,这个通知的用户信息字典会包含键盘的尺寸,以及键盘动画的时间。使用这些数据,观察者可以作一些决定,例如,让被键盘遮挡的界面重新正确的显示出来。
方法:
使用 NSNotificationCenter 中 default notificationcenter 的 postNotificationName:object:userInfo:的实例方法发布一条通知,其中携带一个对象(通常此对象激活通知)和一条关于用户信息的词典,词典中包含了关于此条通知和/或者激活通知的对象的额外信息。
为了建立 NSNotification 类的通知,要使用 NSNotification 的实例方法 notificationWithName:object:userInfo: class。
注意:最好在通知名称前以 Notification 作为后缀。例如,允许通知名称为这样 ResultOfAppendingTwoStrings。然而,这样命名 ResultOfAppendingTwoStringsNotification 会更好。
例子:
NSString *firstName = @"Anthony"; NSString *lastName = @"Robbins"; NSString *fullName = [firstName stringByAppendingString:lastName]; NSArray *objects = [[NSArray alloc] initWithObjects: firstName, lastName, fullName, nil]; NSArray *keys = [[NSArray alloc]initWithObjects: @"firstString", @"secondString", @"resultString",nil]; NSDictionary *userInfo = [[NSDictionary alloc]initWithObjects:objects forKeys:keys]; //创建一个通知实例 NSNotification *notificationObject = [NSNotification notificationWithName:@"ResultOfAppendingTwoStringsNotification" object:self userInfo:userInfo]; //创建一个通知中心来发送通知 [[NSNotificationCenter defaultCenter]postNotification:notificationObject];
注意:有时我们没有必要为每个通知都制定发送者和用户信息字典参数.如果你不打算携带发送者和用户信息字典,建议使用 NSNotificationCenter 中postNotificationName:object:的实例方法,第一个参数传入一个字符串代表通知的名字,第二个参数传入 nil。