作用:NSNotificationCenter是專門供程序中不同類間的消息通信而設置的.
註冊通知:即要在什麼地方接受消息
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mytest:) name:@" mytest" object:nil];
參數介紹:
addObserver: 觀察者,即在什麼地方接收通知;
selector: 收到通知後調用何種方法;
name: 通知的名字,也是通知的唯一標示,編譯器就通過這個找到通知的。
發送通知:調用觀察者處的方法。
[[NSNotificationCenter defaultCenter] postNotificationName:@"mytest" object:searchFriendArray];
參數:
postNotificationName:通知的名字,也是通知的唯一標示,編譯器就通過這個找到通知的。
object:傳遞的參數
註冊方法的寫法:
- (void) mytest:(NSNotification*) notification
{
id obj = [notification object];//獲取到傳遞的對象
}
附:註冊鍵盤升啓關閉消息
|
看一個程序,裏面viewDidLoad中有
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"saveMessage" object:nil];
[center addObserver:self selector:@selector(saveMessage) name:@"saveMessage" object:nil];
不明白爲什麼先去掉註冊者,然後又添加?不是同一個observer嗎?
在有需要的類中,發送消息
//發送消息出去,這裏的對象是一個數組:saveImageArray
[[NSNotificationCenter defaultCenter] postNotificationName:@"postData" object:saveImageArray];
所有親朋好友給我給包(發送消息),,,
//註冊一個observer來響應消息的傳送
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(PostImage:)//接收消息方法
name:@"postData"//消息識別名稱
object:nil];
舉個例子,過年了,準備一個大的錢包(註冊一個OBserver),嘿嘿,,,,
//實現方法
-(void)PostImage:(NSArray *)array
{
//接收傳送過來的消息
}
我把紅包都收起來,(接收消息)
//移除observer
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"postData" object:nil];
紅包都收完了,哈哈,親朋好友回家咯。。
簡單說明,哈哈,不需要理解太複雜。。。。
例說明:KVC用來傳送消息,是很不錯的。
//kvo註冊以parserDatas爲例說明:parserDatas是一個解析XML的類
[parserDatas addObserver:self forKeyPath:@"isFinished" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:parserDatas];
//接收變更通知
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{
if ([keyPath isEqual:@"isFinished"]) {
BOOL isFinished=[[change objectForKey:NSKeyValueChangeNewKey] intValue];
if (isFinished) {//如果服務器數據接收完畢
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObjectsFromArray:parserDatas.parsedDataArray];
//保存數據
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
NSString *path = [DOCUMENT_PATH stringByAppendingPathComponent:@"AllXmlDataArray.bin"];
[NSKeyedArchiver archiveRootObject:array toFile:path];
[array release];
//取消kvo註冊
[object removeObserver:self
forKeyPath:@"isFinished"];
}
}else{
// be sure to call the super implementation
// if the superclass implements it
[super observeValueForKeyPath:keyPath
ofObject:object
change:change
context:context];
}
}
在parserDatas類中定義:
+ (BOOL):(NSString*)key
{
//當這兩個值改變時,使用自動通知已註冊過的觀察者,觀察者需要實現observeValueForKeyPath:ofObject:change:context:方法
if ([key isEqualToString:@"isFinished"])
{
return YES;
}
return [super automaticallyNotifiesObserversForKey:key];
}
發送變更通知:
在需要跟蹤消息記錄的函數中加入:
[self setValue:[NSNumber numberWithBool:YES] forKey:@"isFinished"];
不用的時候,才註銷掉的。。
一般放在dealloc....裏面。
- (void)awakeFromNib{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(switchViews:)
name:@"switchViews"
object:nil];
}
- (void)switchViews:(NSNotification*)notification{
NSNumber *viewNumber = [notification object];
NSInteger i = [viewNumber integerValue];
[self setSelectedSegmentIndex:i];
UIView *chosenView = nil;
switch (i) {
case 0:
chosenView = view1;
break;
case 1:
chosenView = view2;
break;
case 2:
chosenView = view3;
break;
default:
break;
}
if (chosenView) {
[[viewController view] bringSubviewToFront:chosenView];
}
}
- (void)dealloc{
[super dealloc];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end