通知中心就是让任意一个消息的发送者可以将消息发送给任意一个消息的接收者。
创建通知中心:
通知中心是个单例, NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
通知中心要发送消息,消息也是对象,消息的类型:
@interfaceNSNotification :NSObject<NSCopying,NSCoding]] > - (NSString*)name;
- (id)object; - (NSDictionary*)userInfo; @end
发送消息:- (void)postNotification:(NSNotification*)notification;
- (void)postNotificationName:(NSString*)aName object:(id)anObject;
- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;a, postNotificationName,推送消息的名称,匹配在注册消息监听者时的消息名称。
b, object, 发送消息的实例
c, userInfo,发送消息时附带的消息上下文,此实例为一个字典实例
接受消息:
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
a, addObserver,添加监听者实例,此处为当前实例
b, selector,observer中的一个方法指针,当有消息的时候会执行此方法,并把相关上下文以参数传递过去
c, name,注册所关心消息的名称,
d, object,这个是对消息发送方的一个过滤,此参数据说明当前监听器仅对某个对象发出的消息感兴趣。
下面有一份实例:下面有一份实例:用广播电台与听众举个例子,听众需要先调好频道(好比用(void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;方法在消息中心注册一样),然后广播电台发送消息(好比消息中心调用- (void)postNotificationName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)aUserInfo;方法一样),可以通过(SEL)aSelector方法执行想要的操作。
#import<Foundation/Foundation.h>
@interfaceBJBroadCast :NSObject
- (void) boardcast; -(void) boardcastLooper;
@end
#import"BJBroadCast.h"
@implementationBJBroadCast
-(void) boardcastLooper { [NSTimerscheduledTimerWithTimeInterval:1.0ftarget:selfselector:@selector(boardcast)userInfo:nilrepeats:YES]; //启动一个定时器循环发送广播 }
- (void) boardcast { //1.取得通知中心,是个单例
NSNotificationCenter*center = [NSNotificationCenterdefaultCenter]; //消息的内容
staticint i ;
NSString*count = [NSStringstringWithFormat:@"boardcast %d",i++];
NSDictionary*dict = [NSDictionarydictionaryWithObjectsAndKeys:@"boardcast",@"Name",count,@"Value",nil]; //2.发送广播 [centerpostNotificationName:@"BJboardcast"object:selfuserInfo:dict];
}
@end
#import<Foundation/Foundation.h>
@interfacelistener :NSObject
-(void) wanttolisten;
@end
listener.m#import"listener.h"
@implementationlistener
-(void) wanttolisten { //1.要先注册 [[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(recieveBoardcast:)name:@"BJboardcast"object:nil]; //第一个、第二个参数表示只要有@"BJboardcast"这个广播,就调用[self recieveBoardcast:];第四个参数一般都设为nil // 2.接受广播数据 }
- (void) recieveBoardcast:(NSNotification*)notify { //notify就是具体的广播的消息
NSString*name = notify.name;
NSLog(@"notify is %@",notify);
}
@end
#import<Foundation/Foundation.h>
#import"BJBroadCast.h"
#import"listener.h"
int main () {
@autoreleasepool{
listener*l1 = [[listeneralloc]init];
[l1wanttolisten];
listener*l2 = [[listeneralloc]init];
[l2wanttolisten];
BJBroadCast*cast = [[BJBroadCastalloc]init];
[castboardcastLooper]; //要先创建收听者,再创建波段频道,否则,就需要使用boardcastLooper方法。 [[NSRunLoopcurrentRunLoop]run];
}
return0;
}