ios中代理,通知,KVO的簡述

在ios中controllers間是怎樣進行通信,主要是通過1.委托(代理)delegation2.通知 Notification Center 3.鍵值觀察 key value observing (kvo)
他們之間相同點
三種模式都是一個對象傳遞事件給另一個對象,不需要有耦合;
三種模式都是對象來通知某個事件發(fā)生方法,其實就是允許其他對象收到這種事件的方法.
他們之間的區(qū)別
1.delegation
delegation的基本特征,cotroller定義了一個協(xié)議,該協(xié)議描述一個delegate對象為了能夠響應(yīng)該controller的事件而必須做的事.協(xié)議就是delegator說履因,“如果你想作為我的delegate,那么你就必須實現(xiàn)這些方法”盹愚。實現(xiàn)這些方法就是允許controller在它的delegate能夠調(diào)用這些方法栅迄,而它的delegate知道什么時候調(diào)用哪種方法。delegate可以是任何一種對象類型皆怕,因此controller不會與某種對象進行耦合毅舆,但是當(dāng)該對象嘗試告訴委托事情時,該對象能確定delegate將響應(yīng)愈腾。
delegate的優(yōu)勢:
1.非常嚴格的語法憋活。所有將聽到的事件必須是在delegate協(xié)議中有清晰的定義。2.如果delegate中的一個方法沒有實現(xiàn)那么就會出現(xiàn)編譯警告/錯誤3.協(xié)議必須在controller的作用域范圍內(nèi)定義4.在一個應(yīng)用中的控制流程是可跟蹤的并且是可識別的虱黄;5.在一個控制器中可以定義定義多個不同的協(xié)議悦即,每個協(xié)議有不同的delegates6.沒有第三方對象要求保持/監(jiān)視通信過程。7.能夠接收調(diào)用的協(xié)議方法的返回值。這意味著delegate能夠提供反饋信息給controller
缺點:
1.需要定義很多代碼:1.協(xié)議定義盐欺;2.controller的delegate屬性赁豆;3.在delegate本身中實現(xiàn)delegate方法定義2.在釋放代理對象時,需要小心的將delegate改為nil冗美。一旦設(shè)定失敗魔种,那么調(diào)用釋放對象的方法將會出現(xiàn)內(nèi)存crash3.在一個controller中有多個delegate對象,并且delegate是遵守同一個協(xié)議粉洼,但還是很難告訴多個對象同一個事件节预,不過有可能。
二属韧、Notification
在IOS應(yīng)用開發(fā)中有一個”Notification Center“的概念安拟。它是一個單例對象,允許當(dāng)事件發(fā)生時通知一些對象宵喂。它允許我們在低程度耦合的情況下糠赦,滿足控制器與一個任意的對象進行通信的目的。這種模式的基本特征是為了讓其他的對象能夠接收到在該controller中發(fā)生某種事件而產(chǎn)生的消息锅棕,controller用一個key(通知名稱)拙泽。這樣對于controller來說是匿名的,其他的使用同樣的key來注冊了該通知的對象(即觀察者)能夠?qū)νㄖ氖录鞒龇磻?yīng)裸燎。
優(yōu)勢:
1.不需要編寫多少代碼顾瞻,實現(xiàn)比較簡單;2.對于一個發(fā)出的通知德绿,多個對象能夠做出反應(yīng)荷荤,即1對多的方式實現(xiàn)簡單3.controller能夠傳遞context對象(dictionary),context對象攜帶了關(guān)于發(fā)送通知的自定義的信息
缺點:
1.在編譯期不會檢查通知是否能夠被觀察者正確的處理移稳;2.在釋放注冊的對象時蕴纳,需要在通知中心取消注冊;3.在調(diào)試的時候應(yīng)用的工作以及控制過程難跟蹤秒裕;4.需要第三方對喜愛那個來管理controller與觀察者對象之間的聯(lián)系袱蚓;5.controller和觀察者需要提前知道通知名稱、UserInfo dictionary keys几蜻。如果這些沒有在工作區(qū)間定義喇潘,那么會出現(xiàn)不同步的情況;6.通知發(fā)出后梭稚,controller不能從觀察者獲得任何的反饋信息颖低。
三、KVO
KVO是一個對象能夠觀察另外一個對象的屬性的值弧烤,并且能夠發(fā)現(xiàn)值的變化忱屑。前面兩種模式更加適合一個controller與任何其他的對象進行通信,而KVO更加適合任何類型的對象偵聽另外一個任意對象的改變(這里也可以是controller,但一般不是controller)莺戒。這是一個對象與另外一個對象保持同步的一種方法伴嗡,即當(dāng)另外一種對象的狀態(tài)發(fā)生改變時,觀察對象馬上作出反應(yīng)从铲。它只能用來對屬性作出反應(yīng)瘪校,而不會用來對方法或者動作作出反應(yīng)
優(yōu)點:
1.能夠提供一種簡單的方法實現(xiàn)兩個對象間的同步名段。例如:model和view之間同步阱扬;2.能夠?qū)Ψ俏覀儎?chuàng)建的對象,即內(nèi)部對象的狀態(tài)改變作出響應(yīng)伸辟,而且不需要改變內(nèi)部對象(SKD對象)的實現(xiàn)麻惶;3.能夠提供觀察的屬性的最新值以及先前值;4.用key paths來觀察屬性信夫,因此也可以觀察嵌套對象窃蹋;5.完成了對觀察對象的抽象,因為不需要額外的代碼來允許觀察值能夠被觀察
缺點:
1.我們觀察的屬性必須使用strings來定義静稻。因此在編譯器不會出現(xiàn)警告以及檢查脐彩;2.對屬性重構(gòu)將導(dǎo)致我們的觀察代碼不再可用;3.復(fù)雜的“IF”語句要求對象正在觀察多個值姊扔。這是因為所有的觀察代碼通過一個方法來指向;4.當(dāng)釋放觀察者時不需要移除觀察者梅誓。
總結(jié):
從上面的分析中可以看出3中設(shè)計模式都有各自的優(yōu)點和缺點恰梢。其實任何一種事物都是這樣,問題是如何在正確的時間正確的環(huán)境下選擇正確的事物梗掰。下面就講講如何發(fā)揮他們各自的優(yōu)勢嵌言,在哪種情況下使用哪種模式。注意使用任何一種模式都沒有對和錯及穗,只有更適合或者不適合摧茴。每一種模式都給對象提供一種方法來通知一個事件給其他對象,而且前者不需要知道偵聽者埂陆。在這三種模式中苛白,我認為KVO有最清晰的使用案例,而且針對某個需求有清晰的實用性焚虱。而另外兩種模式有比較相似的用處购裙,并且經(jīng)常用來給controller間進行通信。那么我們在什么情況使用其中之一呢鹃栽?根據(jù)我開發(fā)iOS應(yīng)用的經(jīng)歷躏率,我發(fā)現(xiàn)有些過分的使用通知模式。我個人不是很喜歡使用通知中心。我發(fā)現(xiàn)用通知中心很難把握應(yīng)用的執(zhí)行流程薇芝。UserInfo dictionaries的keys到處傳遞導(dǎo)致失去了同步蓬抄,而且在公共空間需要定義太多的常量。對于一個工作于現(xiàn)有的項目的開發(fā)者來說夯到,如果過分的使用通知中心嚷缭,那么很難理解應(yīng)用的流程。我覺得使用命名規(guī)則好的協(xié)議和協(xié)議方法定義對于清晰的理解controllers間的通信是很容易的黄娘。努力的定義這些協(xié)議方法將增強代碼的可讀性峭状,以及更好的跟蹤你的app。代理協(xié)議發(fā)生改變以及實現(xiàn)都可通過編譯器檢查出來逼争,如果沒有將會在開發(fā)的過程中至少會出現(xiàn)crash优床,而不僅僅是讓一些事情異常工作。甚至在同一事件通知多控制器的場景中誓焦,只要你的應(yīng)用在controller層次有著良好的結(jié)構(gòu)胆敞,消息將在該層次上傳遞。該層次能夠向后傳遞直至讓所有需要知道事件的controllers都知道杂伟。當(dāng)然會有delegation模式不適合的例外情況出現(xiàn)移层,而且notification可能更加有效。例如:應(yīng)用中所有的controller需要知道一個事件赫粥。然而這些類型的場景很少出現(xiàn)观话。另外一個例子是當(dāng)你建立了一個架構(gòu)而且需要通知該事件給正在運行中應(yīng)用。根據(jù)經(jīng)驗越平,如果是屬性層的時間频蛔,不管是在不需要編程的對象還是在緊緊綁定一個view對象的model對象,我只使用觀察秦叛。對于其他的事件晦溪,我都會使用delegate模式。如果因為某種原因我不能使用delegate挣跋,首先我將估計我的app架構(gòu)是否出現(xiàn)了嚴重的錯誤三圆。如果沒有錯誤,然后才使用notification避咆。
文/Se7ven(簡書作者)原文鏈接:http://www.reibang.com/p/21c06921f3a2著作權(quán)歸作者所有舟肉,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標注“簡書作者”查库。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末度气,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子膨报,更是在濱河造成了極大的恐慌磷籍,老刑警劉巖适荣,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異院领,居然都是意外死亡弛矛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門比然,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丈氓,“玉大人,你說我怎么就攤上這事强法⊥蛩祝” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵饮怯,是天一觀的道長闰歪。 經(jīng)常有香客問我,道長蓖墅,這世上最難降的妖魔是什么库倘? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮论矾,結(jié)果婚禮上教翩,老公的妹妹穿的比我還像新娘。我一直安慰自己贪壳,他們只是感情好饱亿,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闰靴,像睡著了一般路捧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上传黄,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音队寇,去河邊找鬼膘掰。 笑死,一個胖子當(dāng)著我的面吹牛佳遣,可吹牛的內(nèi)容都是我干的识埋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼零渐,長吁一口氣:“原來是場噩夢啊……” “哼窒舟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诵盼,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤惠豺,失蹤者是張志新(化名)和其女友劉穎银还,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洁墙,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蛹疯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了热监。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捺弦。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖孝扛,靈堂內(nèi)的尸體忽然破棺而出列吼,到底是詐尸還是另有隱情,我是刑警寧澤苦始,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布寞钥,位于F島的核電站,受9級特大地震影響盈简,放射性物質(zhì)發(fā)生泄漏凑耻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一柠贤、第九天 我趴在偏房一處隱蔽的房頂上張望香浩。 院中可真熱鬧,春花似錦臼勉、人聲如沸邻吭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囱晴。三九已至,卻和暖如春瓢谢,著一層夾襖步出監(jiān)牢的瞬間畸写,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工氓扛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枯芬,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓采郎,卻偏偏與公主長得像千所,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒜埋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容