什么是觀察者模式?當A對B的變化感興趣,需要監聽B的狀態變化,就注冊為B的觀察者,當B發生變化時通知A,告知B發生了變化,B根據A的變化作出相應的操作響應。這是一種非常典型的觀察者的用法,我把這種使用方法叫做經典觀察者模式。
從經典的角度看,觀察者模式是一種通知變化的模式,一般認為只在對象發生變化感興趣的場合有用。主題對象知道有觀察者存在,設置會維護觀察者的一個隊列;觀察者模式應當是在面向對象編程中被大規模使用的設計模式之一。
經典觀察者模式
經典觀察者模式被認為是對象的行為模式,又叫發布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式。經典觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態上發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己或者做出相應的一些動作。在文章一開始舉的例子就是典型觀察者模式的應用。
而在IOS開發中我們可能會接觸到的經典觀察者模式的實現方式,有這么幾種:NSNotificationCenter、KVO、Delegate等
感知通知方式
在經典觀察者模式中,因為觀察者感知到主題對象變化方式的不同,又分為推模型和拉模型兩種方式。主要介紹推模型方式。
主題對象向觀察者推送主題的詳細信息,不管觀察者是否需要,推送的信息通常是主題對象的全部或者部分數據。推模型實現了觀察者和主題對象的解耦,兩者之間沒有過度的依賴關系。但是推模型每次都會以廣播的方式,向所有觀察者發送通知。所有觀察者被動的接受通知。當通知的內容過多時,多個觀察者同時接收,可能會對網絡、內存(有些時候還會涉及IO)有較大影響。
在IOS中典型的推模型實現方式為NSNotificationCenter和KVO。
NSNotificationCenter
NSnotificationCenter是一種典型的有調度中心的觀察者模式實現方式。以NSNotificationCenter為中心,觀察者往Center中注冊對某個主題對象的變化感興趣,主題對象通過NSNotificationCenter進行變化廣播。這種模型就是文章開始發布訂閱報紙在OC中的一種類似實現。所有的觀察和監聽行為都向同一個中心注冊,所有對象的變化也都通過同一個中心向外廣播。
SNotificationCenter就像一個樞紐一樣,處在整個觀察者模式的核心位置,調度著消息在觀察者和監聽者之間傳遞。使用如下:
1、觀察者Observer,一般繼承自NSObject,通過NSNotificationCenter的addObserver:selector:name:object接口來注冊對某一類型通知感興趣.在注冊時候一定要注意,NSNotificationCenter不會對觀察者進行引用計數+1的操作,我們在程序中釋放觀察者的時候,一定要去報從center中將其注銷了。使用方法如下:
//注冊觀察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:XGSDKContainerDidRotate object:nil];
}
//解析消息內容
- (void)didRotate:(UIInterfaceOrientation)fromInterfaceOrientation
{
if ([XGSDKAuthModel sharedAuthModel].useFullscreen) {
self.view.frame = CGRectMake(0, 0, WIDTH, HEIGHT);
_webview.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
}
}
}
最后要記得在dealloc方法中注銷掉,代碼如下:
[[NSNotificationCenter defaultCenter] removeObserver:self];
}