一激捏、解析
1. NSNotificationCenter
NSnotificationCenter是一種典型的有調度中心的觀察者模式實現(xiàn)方式胎挎。以NSNotificationCenter為中心席噩,觀察者往Center中注冊對某個主題對象的變化感興趣月匣,主題對象通過NSNotificationCenter進行變化廣播承边。這種模型就是文章開始發(fā)布訂閱報紙在OC中的一種類似實現(xiàn)掖蛤。所有的觀察和監(jiān)聽行為都向同一個中心注冊,所有對象的變化也都通過同一個中心向外廣播刁标。
特點:“一對多”
2. 通知機制
在通知機制中對某個通知感興趣的所有對象都可以成為接收者颠通。
首先,這些對象需要對通知中心(NSNotificationCenter)發(fā)出addObserver:selector:name:object:消息進行注冊,在投送對象投
送通知給通知中心時,通知中心就會把通知廣播給注冊過的接收者。所有的接收者都不知道通知是誰投送的,更不關心它的細節(jié)膀懈。投送對象與接收者是一對多的關系顿锰。接收者如果對通知不再關注,會給通知中心發(fā)出
removeObserver:name:object:消息解除注冊,以后不再接收通知。
二吏砂、實現(xiàn)
1. 觀察者所在類
1)注冊觀察者:(一般在viewDidLoad方法中實現(xiàn))
//name為通知名撵儿,作為區(qū)分
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleAction:)
name:@"test"
object:nil];
]
- observer:監(jiān)聽器,即誰要接收這個通知
- Selector:收到通知后狐血,回調監(jiān)聽器的這個方法淀歇,并且把通知對象當做參數(shù)傳入
- Name:通知的名稱。如果為nil匈织,那么無論通知的名稱是什么浪默,監(jiān)聽器都能收到這個通知
- Object:通知發(fā)布者。如果Object和Name都為nil缀匕,監(jiān)聽器都收到所有的通知
2)接收廣播后的處理
-(void)handleAction:(NSNotification*)notification
{
//獲取userinfo
NSDictionary *theData = [notification userInfo];
//[notification object] 可獲取post的object對象
//作出反應
if (theData !=nil) {
NSString *data =
[theData objectForKey:@"testKey"];
NSLog(@"FlipsideViewController App Terminate Date: %@", data);
}
}
3)解除注冊(一般在dealloc方法中解除=注冊)
-(void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
2. 被觀察的對象
通過postNotificationName:object:userInfo:發(fā)送某一類型通知纳决,廣播改變。
//傳遞的數(shù)據(jù)
NSDictionary *dataDict = [NSDictionary dictionaryWithObject:self.testTextField.text forKey:@"testKey"];
//發(fā)出通知(廣播)
[[NSNotificationCenter defaultCenter] postNotificationName:@"test"
object:self
userInfo:dataDict];
一個通知對象要包含的內容:
- (NSString *)name; // 通知的名稱
- (id)object; // 發(fā)送對象類型數(shù)據(jù),如果接收者不需要乡小,可設為nil
- (NSDictionary
*)userInfo; // 一些額外的信息(通知發(fā)布者傳遞給通知接收者的信息內容)
- (NSDictionary