在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),并標注“簡書作者”查库。
ios中代理,通知,KVO的簡述
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門比然,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丈氓,“玉大人,你說我怎么就攤上這事强法⊥蛩祝” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵饮怯,是天一觀的道長闰歪。 經(jīng)常有香客問我,道長蓖墅,這世上最難降的妖魔是什么库倘? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮论矾,結(jié)果婚禮上教翩,老公的妹妹穿的比我還像新娘。我一直安慰自己贪壳,他們只是感情好饱亿,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闰靴,像睡著了一般路捧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上传黄,一...
- 文/蒼蘭香墨 我猛地睜開眼零渐,長吁一口氣:“原來是場噩夢啊……” “哼窒舟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诵盼,我...
- 正文 年R本政府宣布寞钥,位于F島的核電站,受9級特大地震影響盈简,放射性物質(zhì)發(fā)生泄漏凑耻。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一柠贤、第九天 我趴在偏房一處隱蔽的房頂上張望香浩。 院中可真熱鬧,春花似錦臼勉、人聲如沸邻吭。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽囱晴。三九已至,卻和暖如春瓢谢,著一層夾襖步出監(jiān)牢的瞬間畸写,已是汗流浹背。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 轉(zhuǎn)載自:http://blog.csdn.net/dqjyong/article/details/7685933 ...
- *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
- 2.23看不懂的自己 上一章小說《十年愛情買賣》2.22一手遮天 程云標的效率非常高,第二天的太陽從東方升起忆家,城市...