ios觀察者模式

什么是觀察者模式?當(dāng)A對(duì)B的變化感興趣,需要監(jiān)聽B的狀態(tài)變化,就注冊(cè)為B的觀察者,當(dāng)B發(fā)生變化時(shí)通知A,告知B發(fā)生了變化,B根據(jù)A的變化作出相應(yīng)的操作響應(yīng)。這是一種非常典型的觀察者的用法,我把這種使用方法叫做經(jīng)典觀察者模式。

從經(jīng)典的角度看,觀察者模式是一種通知變化的模式,一般認(rèn)為只在對(duì)象發(fā)生變化感興趣的場(chǎng)合有用。主題對(duì)象知道有觀察者存在,設(shè)置會(huì)維護(hù)觀察者的一個(gè)隊(duì)列;觀察者模式應(yīng)當(dāng)是在面向?qū)ο缶幊讨斜淮笠?guī)模使用的設(shè)計(jì)模式之一。

經(jīng)典觀察者模式
經(jīng)典觀察者模式被認(rèn)為是對(duì)象的行為模式,又叫發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式。經(jīng)典觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)上發(fā)生變化時(shí),會(huì)通知所有觀察者對(duì)象,使它們能夠自動(dòng)更新自己或者做出相應(yīng)的一些動(dòng)作。在文章一開始舉的例子就是典型觀察者模式的應(yīng)用。

而在IOS開發(fā)中我們可能會(huì)接觸到的經(jīng)典觀察者模式的實(shí)現(xiàn)方式,有這么幾種:NSNotificationCenter、KVO、Delegate等

感知通知方式
在經(jīng)典觀察者模式中,因?yàn)橛^察者感知到主題對(duì)象變化方式的不同,又分為推模型和拉模型兩種方式。主要介紹推模型方式。
主題對(duì)象向觀察者推送主題的詳細(xì)信息,不管觀察者是否需要,推送的信息通常是主題對(duì)象的全部或者部分?jǐn)?shù)據(jù)。推模型實(shí)現(xiàn)了觀察者和主題對(duì)象的解耦,兩者之間沒有過度的依賴關(guān)系。但是推模型每次都會(huì)以廣播的方式,向所有觀察者發(fā)送通知。所有觀察者被動(dòng)的接受通知。當(dāng)通知的內(nèi)容過多時(shí),多個(gè)觀察者同時(shí)接收,可能會(huì)對(duì)網(wǎng)絡(luò)、內(nèi)存(有些時(shí)候還會(huì)涉及IO)有較大影響。
在IOS中典型的推模型實(shí)現(xiàn)方式為NSNotificationCenter和KVO。

NSNotificationCenter
NSnotificationCenter是一種典型的有調(diào)度中心的觀察者模式實(shí)現(xiàn)方式。以NSNotificationCenter為中心,觀察者往Center中注冊(cè)對(duì)某個(gè)主題對(duì)象的變化感興趣,主題對(duì)象通過NSNotificationCenter進(jìn)行變化廣播。這種模型就是文章開始發(fā)布訂閱報(bào)紙?jiān)贠C中的一種類似實(shí)現(xiàn)。所有的觀察和監(jiān)聽行為都向同一個(gè)中心注冊(cè),所有對(duì)象的變化也都通過同一個(gè)中心向外廣播。

SNotificationCenter就像一個(gè)樞紐一樣,處在整個(gè)觀察者模式的核心位置,調(diào)度著消息在觀察者和監(jiān)聽者之間傳遞。使用如下:
1、觀察者Observer,一般繼承自NSObject,通過NSNotificationCenter的addObserver:selector:name:object接口來注冊(cè)對(duì)某一類型通知感興趣.在注冊(cè)時(shí)候一定要注意,NSNotificationCenter不會(huì)對(duì)觀察者進(jìn)行引用計(jì)數(shù)+1的操作,我們?cè)诔绦蛑嗅尫庞^察者的時(shí)候,一定要去報(bào)從center中將其注銷了。使用方法如下:

//注冊(cè)觀察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:XGSDKContainerDidRotate object:nil];
}
//解析消息內(nèi)容
- (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];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 觀察者模式本質(zhì)上時(shí)一種發(fā)布-訂閱模型,用以消除具有不同行為的對(duì)象之間的耦合,通過這一模式,不同對(duì)象可以協(xié)同工作,同...
    PlatonsDream閱讀 1,397評(píng)論 0 0
  • 一.什么是觀察者模式? 簡(jiǎn)單的說就是一個(gè)對(duì)象擁有多個(gè)特征,當(dāng)某一個(gè)特征發(fā)生變化時(shí),另外一個(gè)對(duì)象做出相應(yīng)的處理和操作...
    LYSNote閱讀 4,302評(píng)論 0 5
  • KVO即:Key-Value Observing, 直譯為:基于鍵值的觀察者。 它提供一種機(jī)制,當(dāng)指定的對(duì)象的屬性...
    _Lily閱讀 1,061評(píng)論 0 1
  • 1 場(chǎng)景問題# 1.1 訂閱報(bào)紙的過程## 來考慮實(shí)際生活中訂閱報(bào)紙的過程,這里簡(jiǎn)單總結(jié)了一下,訂閱報(bào)紙的基本流程...
    七寸知架構(gòu)閱讀 4,810評(píng)論 5 57
  • 前言 什么是觀察者模式?我們先打個(gè)比方,這就像你訂報(bào)紙。比如你想知道美國最近放生了些新聞,你可能會(huì)訂閱一份美國周刊...
    寒橋閱讀 598評(píng)論 1 1

友情鏈接更多精彩內(nèi)容