iOS架構(gòu)師?So easy策精!

序言

年年歲歲花相似舰始,歲歲年年人不同。

很久很久以前……

MVC模式以低耦合性蛮寂、高重用性蔽午、可維護性等優(yōu)點,使得原本復(fù)雜的代碼與界面的交互變得簡單酬蹋、清晰及老、明了抽莱。開發(fā)者可以把更多的精力放在前端界面的設(shè)計上,而不用絞盡腦汁去思考究竟應(yīng)該如何使界面得到同步骄恶。既減輕了設(shè)計壓力食铐,又能極大提高用戶體驗感。

接下來小編來淺談一下這些架構(gòu)模式僧鲁,同時小編也歡迎大家加入小編的iOS交流群551346706虐呻,群里會提供架構(gòu)的資料,書籍歡迎大家入駐寞秃!

然而隨著時間的推移以及技術(shù)的發(fā)展斟叼,傳統(tǒng)的MVC模式已經(jīng)不適合當下的iOS開發(fā)了。先讓我們來復(fù)習一下iOS中的MVC模式吧春寿!

MVC架構(gòu)模式

在 iOS 開發(fā)中朗涩,MVC(Model View Controller)是構(gòu)建iOS App的標準模式。在MVC下绑改,所有的對象被歸類為一個Model谢床,一個View,和一個Controller厘线。Model持有數(shù)據(jù)识腿,View顯示與用戶交互的界面,而ViewController調(diào)解Model和View之間的交互造壮。

現(xiàn)在渡讼,MVC 依然是目前主流客戶端編程框架。然而费薄,在MVC模式中硝全,厚重的Controller、無以立足的網(wǎng)絡(luò)邏輯和較差的可測試性已經(jīng)成為該模式無可避免的問題了

厚重的Controller

由于大量的代碼被放進view controller楞抡,導(dǎo)致他們變的相當臃腫伟众。網(wǎng)絡(luò)數(shù)據(jù)的請求及后續(xù)處理,本地數(shù)據(jù)庫操作召廷,以及一些帶有工具性質(zhì)輔助方法都加大了MassiveViewController的產(chǎn)生凳厢。

遺失的網(wǎng)絡(luò)邏輯

蘋果使用的MVC的定義上說,所有的對象都可以被歸類為一個model,一個view或是一個controller竞慢。那么要把網(wǎng)絡(luò)的代碼放在哪里呢先紫?

顯然,不應(yīng)該把網(wǎng)絡(luò)請求放在view中筹煮。若把它放在model對象里遮精,網(wǎng)絡(luò)調(diào)用應(yīng)該使用異步,可是這樣的話如果一個網(wǎng)絡(luò)請求比它持有的model生命周期更長,事情就會變得復(fù)雜本冲。若是放在contoller里面准脂,也會加劇厚重controller的問題。

較差的可測試性

由于View Controller混合了視圖處理邏輯和業(yè)務(wù)邏輯檬洞,分離這些成分的單元測試成了一個艱巨的任務(wù)狸膏。

為了避免和解決上述問題的產(chǎn)生,于是就從MVC引申出來一種維護性較強添怔、耦合性低的新的架構(gòu)MVVM(Model View View-Mode)湾戳,MVVM正式規(guī)范了視圖和控制器緊耦合的性質(zhì),并引入新的組件广料。MVVM主要目的是為了分離視圖(View)和模型(Model)砾脑。

MVVM模式

MVVM是Model-View-ViewModel 的簡寫,最早于2005年被微軟的WPF 和 Silverlight的架構(gòu)師John Gossman提出艾杏。

Model:和MVC中的model保持一致拦止,用于處理數(shù)據(jù)邏輯

View:由 MVC 中的view和 controller 組成,負責 UI 的展示糜颠,綁定 viewModel中的屬性,觸發(fā) viewModel 中的命令以及呈現(xiàn)由viewModel提供的數(shù)據(jù)萧求。

View-Model:它的職責之一就是作為一個表現(xiàn)視圖顯示自身所需數(shù)據(jù)的靜態(tài)模型其兴,它是從 MVC 的 controller 中抽取出來的展示邏輯,負責從 model中獲取 view 所需的數(shù)據(jù)夸政,轉(zhuǎn)換成 view可以展示的數(shù)據(jù)元旬,并暴露公開的屬性和命令供 view 進行綁定。

在MVVM實現(xiàn)中守问,利用 RAC來優(yōu)雅的實現(xiàn)view 和 viewModel 兩者之間的數(shù)據(jù)綁定(同步)匀归。

MVVM優(yōu)點

1. 低耦合。視圖(View)可以獨立于Model變化和修改耗帕,一個ViewModel可以綁定到不同的"View"上穆端,當View變化的時候Model可以不變,當Model變化的時候View也可以不變仿便。

2. 可重用性体啰。你可以把一些視圖邏輯放在一個ViewModel里面,讓很多view重用這段視圖邏輯嗽仪。

3. 獨立開發(fā)荒勇。開發(fā)人員可以專注于業(yè)務(wù)邏輯和數(shù)據(jù)的開發(fā)(ViewModel),設(shè)計人員可以專注于頁面設(shè)計闻坚,使用Expression Blend可以很容易設(shè)計界面并生成xml代碼沽翔。

4. 可測試。界面素來是比較難于測試的窿凤,而現(xiàn)在測試可以針對ViewModel來寫仅偎。

MVP模式

MVP是由 MVC演變而來的跨蟹,它的Presenter根本不用關(guān)心ViewController的生命周期,所以在 Presenter里面幾乎沒有涉及到 UI 的代碼哨颂,我們所有的 UI 處理全部放到了UIViewController里面喷市,這樣的話很符合設(shè)計模式中的單一職責。

在MVP中威恼,View和Model之間是不存在引用和依賴的品姓。

下面分享一個MVP架構(gòu)模式的簡單案例

新建下面的類

在MVPContoller中對三個角色進行關(guān)聯(lián)。

創(chuàng)建屬性

controller類需要關(guān)聯(lián)三個角色箫措,因此需要在該類中創(chuàng)建三個角色的屬性腹备。

對三個角色進行初始化設(shè)置

分別創(chuàng)建三個角色,MVPView要添加到Controller上顯示斤蔓。這個案例就是為了將Model的內(nèi)容顯示到view中植酥。所以這里提前給model設(shè)置好內(nèi)容。調(diào)用presenter的printTask方法將兩者關(guān)聯(lián)起來弦牡。

model中存儲需要的數(shù)據(jù)友驮,定義內(nèi)容屬性

此處跟mvc不同之處就是給view傳遞的是一個字符串而不是一個model。因為view與model在mvp架構(gòu)是無關(guān)聯(lián)的驾锰。

在MVPView.h中創(chuàng)建展示view的方法體

在MVPView.m文件中添加按鈕

初始化按鈕卸留,讓model的內(nèi)容顯示在label上。

presenter.h創(chuàng)建一個方法

這個是業(yè)務(wù)邏輯的入口椭豫。

在MVP模式中耻瑟,所有的耦合都存在與Presenter之中,所以Presenter需要有View和Model的存在赏酥。

將兩者通過Presenter聯(lián)系起來

Prensenter的作用就是調(diào)用view并把model的內(nèi)容傳遞給它喳整。

?到程序入口處調(diào)用MVPController

如此一來,一個簡單的MVP案例搭建完畢裸扶。

面試題

1框都、在MVC模式中,如何解決controller層的臃腫問題姓言?

將網(wǎng)絡(luò)請求抽象到單獨的類中

將界面的拼裝抽象到專門的類中

構(gòu)造 ViewModel?

這樣抽象之后瞬项,View 只接受 ViewModel,而 Controller 只需要傳遞 ViewModel 這么一行代碼何荚。而另外構(gòu)造 ViewModel 的過程囱淋,我們就可以移動到另外的類中了

專門構(gòu)造存儲類

2、MVC 和 MVVM 的區(qū)別

MVVM是對胖模型進行的拆分餐塘,其本質(zhì)是給控制器減負妥衣,將一些弱業(yè)務(wù)邏輯放到VM中處理

MVC是一切設(shè)計的基礎(chǔ),所有新的設(shè)計模式都是基于MVC進行的改進。

參考鏈接:

https://juejin.im/post/59de301cf265da4310475f2c

http://www.reibang.com/p/db8400e1d40e

http://www.reibang.com/p/79591e226d8c

最后

小編在這也推薦一下自己QQ群:551346706税手,學習氛圍還行蜂筹,共同學習探討,三人行必有我?guī)熉梗黄馂樽约焊玫?018加油

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艺挪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子兵扬,更是在濱河造成了極大的恐慌麻裳,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件器钟,死亡現(xiàn)場離奇詭異津坑,居然都是意外死亡,警方通過查閱死者的電腦和手機傲霸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門疆瑰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人昙啄,你說我怎么就攤上這事穆役。” “怎么了梳凛?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵逢并,是天一觀的道長尝盼。 經(jīng)常有香客問我乎完,道長松逊,這世上最難降的妖魔是什么秘狞? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任叭莫,我火速辦了婚禮,結(jié)果婚禮上烁试,老公的妹妹穿的比我還像新娘雇初。我一直安慰自己,他們只是感情好减响,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布靖诗。 她就那樣靜靜地躺著,像睡著了一般支示。 火紅的嫁衣襯著肌膚如雪刊橘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天颂鸿,我揣著相機與錄音促绵,去河邊找鬼。 笑死,一個胖子當著我的面吹牛败晴,可吹牛的內(nèi)容都是我干的浓冒。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼尖坤,長吁一口氣:“原來是場噩夢啊……” “哼稳懒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起慢味,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤场梆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贮缕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辙谜,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年感昼,在試婚紗的時候發(fā)現(xiàn)自己被綠了装哆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡定嗓,死狀恐怖蜕琴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宵溅,我是刑警寧澤凌简,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站恃逻,受9級特大地震影響雏搂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寇损,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一凸郑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧矛市,春花似錦芙沥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至找田,卻和暖如春歌憨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背墩衙。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工躺孝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留享扔,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓植袍,卻偏偏與公主長得像惧眠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子于个,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

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