iOS設計模式2 - 觀察者模式_通知機制

weixin_34146805發表於2018-07-18

一、解析

1. NSNotificationCenter

NSnotificationCenter是一種典型的有排程中心的觀察者模式實現方式。以NSNotificationCenter為中心,觀察者往Center中註冊對某個主題物件的變化感興趣,主題物件通過NSNotificationCenter進行變化廣播。這種模型就是文章開始釋出訂閱報紙在OC中的一種類似實現。所有的觀察和監聽行為都向同一個中心註冊,所有物件的變化也都通過同一個中心向外廣播。

2428275-2275d6ea87d08060.png
通知機制.png

特點:“一對多”

2. 通知機制

在通知機制中對某個通知感興趣的所有物件都可以成為接收者。
首先,這些物件需要對通知中心(NSNotificationCenter)發出addObserver:selector:name:object:訊息進行註冊,在投送物件投
送通知給通知中心時,通知中心就會把通知廣播給註冊過的接收者。所有的接收者都不知道通知是誰投送的,更不關心它的細節。投送物件與接收者是一對多的關係。接收者如果對通知不再關注,會給通知中心發出
removeObserver:name:object:訊息解除註冊,以後不再接收通知。

2428275-953df428d4d1f949.png
通知機制圖.png

二、實現

1. 觀察者所在類

1)註冊觀察者:(一般在viewDidLoad方法中實現)

  //name為通知名,作為區分
  [[NSNotificationCenter defaultCenter]  addObserver:self
                                            selector:@selector(handleAction:)
                                                name:@"test"
                                              object:nil];
]
  • observer:監聽器,即誰要接收這個通知
  • Selector:收到通知後,回撥監聽器的這個方法,並且把通知物件當做引數傳入
  • Name:通知的名稱。如果為nil,那麼無論通知的名稱是什麼,監聽器都能收到這個通知
  • Object:通知釋出者。如果Object和Name都為nil,監聽器都收到所有的通知

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:傳送某一型別通知,廣播改變。

//傳遞的資料
NSDictionary *dataDict = [NSDictionary dictionaryWithObject:self.testTextField.text forKey:@"testKey"];
//發出通知(廣播)
[[NSNotificationCenter defaultCenter] postNotificationName:@"test"
                                                    object:self
                                                  userInfo:dataDict];

一個通知物件要包含的內容:

    1. (NSString *)name; // 通知的名稱
    1. (id)object; // 傳送物件型別資料,如果接收者不需要,可設為nil
    1. (NSDictionary
      *)userInfo; // 一些額外的資訊(通知釋出者傳遞給通知接收者的資訊內容)

補充,可以參考:http://www.th7.cn/Program/IOS/201406/212434.shtml

相關文章