標籤:
(小喵家的哈比鎮樓)
小喵最近在整理資料。看到了通知這個東東,忍不住給大家分享一下自己的學習所得。
什麼是通知
通知(Notification)是開發架構中觀察者模式的一種實現方式,內部的實現機制由Cocoa架構支援,通常用於試圖控制器和資料模型的互動。通過通知,可以向一個或者多個對象發送訊息。
繼承自NSObject,實現了NSCopying Protocol協議。
通知通過通知中樞(NSNotificationCenter)廣播給其他對象。通知包含一個名稱(name), 對象(object屬性), 和一個可選字典(dictionary 屬性)三個參數。這些參數協助完成通知操作。
通知的原理
Notification一個 對象非常簡單,就是poster要提供給observer的資訊包裹。Notification 對象有兩個重要的成員變數:name和object。一般name用來唯一標示一個通知對象,object都是指向寄件者(poster)(為了讓observer在接收到notification時可以回調到poster)所以,Notification有兩個方法:- (NSString *)name, - (id)object可供調用。同時,Notification對象還包含一個參數,就是字典(選擇性參數),這個字典中儲存一些傳值過程中的資訊,供接收者使用。系統要求這個參數是不可變字典。
以上資訊構建好後,我們就可以建立一個通知。
NSNotification *notification = nil;
notification = [NSNotification notificationWithName: aName object: aObj userInfo: aDictionary];
其中,aName就是notification對象的名稱,aObj 就是寄件者,aDictionary是通知的可選字典參數。
通知建立好後就可以在必要的時候發送通知,發送通知的時候,需要一個控制中心來發送通知,這個控制中心就是通知中樞(NSNotificationCenter)。我們也可以通過控制中心建立並發送通知,通常我們也是這麼做得。
通知的實際運用
1. 頁面關聯性不大,但需要傳遞資訊的地方。這兩個頁面一個作為寄件者,一個作為監聽者;
2. 需要向多個地方發送資訊。一個頁面作為寄件者,多個頁面作為監聽者。
如何使用通知
1.註冊通知
2.發送通知
3.移除通知
代碼實現
建立一個ViewController,修改為MRC。在.m檔案裡面操作。
先看註冊通知
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 UIView *mainView = [[[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds]autorelease]; 4 self.view = mainView; 5 6 UIButton *redButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 7 redButton.frame = CGRectMake(100, 100, 100, 30); 8 [redButton setTitle:@"Red" forState:UIControlStateNormal]; 9 [redButton addTarget:self action:@selector(setRedColor) forControlEvents:UIControlEventTouchUpInside];10 [self.view addSubview:redButton];11 12 UIButton *blueButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];13 [blueButton setTitle:@"Blue" forState:UIControlStateNormal];14 blueButton.frame = CGRectMake(100, 150, 100, 30);15 [blueButton addTarget:self action:@selector(setBlueColor) forControlEvents:UIControlEventTouchUpInside];16 [self.view addSubview:blueButton];17 /**18 * 註冊通知19 */20 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doChange:) name:@"ColorChange" object:nil];21 22 }
發送通知
1 - (void)setBlueColor{ 2 /** 3 * 發送通知 4 */ 5 NSDictionary *dic = [NSDictionary dictionaryWithObject:@"blueColor" forKey:@"color"]; 6 [[NSNotificationCenter defaultCenter] postNotificationName:@"ColorChange" object:self userInfo:dic]; 7 } 8 9 - (void)setRedColor{10 /**11 * 發送通知12 */13 NSDictionary *dic = [NSDictionary dictionaryWithObject:@"redColor" forKey:@"color"];14 [[NSNotificationCenter defaultCenter]postNotificationName:@"ColorChange" object:self userInfo:dic];15 }16 17 - (void)doChange:(NSNotification *)notification{18 NSDictionary *dic = [notification userInfo];19 NSString *colorStr = [dic valueForKey:@"color"];20 UIColor *color = nil;21 22 if ([colorStr isEqualToString:@"blueColor"]) {23 color = [UIColor blueColor];24 }25 if ([colorStr isEqualToString:@"redColor"]) {26 color = [UIColor redColor];27 }28 self.view.backgroundColor = color;29 }
移除通知
1 - (void)dealloc{2 /**3 * 移除通知4 */5 [[NSNotificationCenter defaultCenter]removeObserver:self];6 [super dealloc];7 }
實現效果如下。點擊紅色螢幕變成紅色,點擊藍色,螢幕變成藍色。
小喵iOS開發成長記:通知(Notification)快速入門