MYDay-第1期-Introduction to MVC-MVVM for iOS

Preface


首先箕慧,感謝一下老師和朋友們對我一直以來的支持以及寬容服球。最近,我所實習(xí)的公司開辦了一個名為 MY Day 的內(nèi)部技術(shù)分享活動颠焦,作為活動的組織者之一及第一期的分享嘉賓斩熊,我倍感榮幸,但同時也壓力山大伐庭》矍考慮到公司新來實習(xí)的同學(xué)們基礎(chǔ)不同,思來想去圾另,第一期還是分享一些基礎(chǔ)的知識霸株,目的是參與的人能夠聽懂,并提出一些比較好的問題集乔,希望起到拋磚引玉的作用去件。內(nèi)容不新鮮,希望大家批評指正扰路,多多包容尤溜,感謝!

What is MVC


MVC全稱是Model View Controller汗唱,是模型 (model)-視圖 (view)-控制器 (controller) 的縮寫宫莱。它表示的是一種常見的客戶端軟件開發(fā)框架。MVC 的概念最早出現(xiàn)在二十世紀八十年代的 施樂帕克 實驗室中(對渡嚣,就是那個發(fā)明圖形用戶界面和鼠標的實驗室)梢睛,當(dāng)時施樂帕克為 Smalltalk 發(fā)明了這種軟件設(shè)計模式。
現(xiàn)在识椰,MVC 已經(jīng)成為主流的客戶端編程框架绝葡,在 iOS 開發(fā)中,系統(tǒng)為我們實現(xiàn)好了公共的視圖類:UIView腹鹉,和控制器類:UIViewController藏畅。大多數(shù)時候,我們都需要繼承這些類來實現(xiàn)我們的程序邏輯功咒,因此愉阎,我們幾乎逃避不開 MVC 這種設(shè)計模式。

How MVC work


總的來說力奋,視圖(view)傳送指令到Controller榜旦,Controller完成業(yè)務(wù)邏輯后,依賴指令去選擇加載某個Model或要求Model改變狀態(tài)景殷,Model將新的數(shù)據(jù)發(fā)送給view溅呢,view更新數(shù)據(jù)澡屡,用戶得到反饋。


  • 視圖(View):實現(xiàn)數(shù)據(jù)有目的的顯示咐旧,通常是一個用戶界面元素驶鹉。在視圖中一般沒有程序上的邏輯。在Web應(yīng)用中的MVC铣墨,通常把顯示動態(tài)數(shù)據(jù)的html頁面稱之為視圖骤视。
  • 視圖控制器(Controller):處理和響應(yīng)事件金刁,通常是用戶操作试伙,并監(jiān)控模型上的變化兽愤,然后去修改數(shù)據(jù)。
  • 模型(Model):模型用于封裝與應(yīng)用業(yè)務(wù)邏輯相關(guān)的數(shù)據(jù)及對相關(guān)數(shù)據(jù)的處理方法碱妆,模型不關(guān)心自己會被如何調(diào)用肉盹、如何顯示昔驱、如何操作疹尾。

How to communicate between M-V-C


該部分圖片及內(nèi)容來自斯坦福大學(xué)公開課,我認為他就 iOS 方面的MVC的通信的描述骤肛,還是比較好的纳本。內(nèi)容概括為以下幾點:

communications
1、Between Controller and View
  • Controller通過outlet "出口"持有view
  • View上的action目標動作會反饋到Controller對應(yīng)的target上
  • View的沒一個action動作腋颠,都會通過delegate代理反饋給Controller繁成,包括will、did淑玫、should等巾腕,意思是將要/已經(jīng)/正在進行動作
  • View需要Controller為之解釋模型
  • View上需要的數(shù)據(jù),通過View和Controller之間的dataSource數(shù)據(jù)源獲得
  • Controller和View之間采用blind structured way(盲結(jié)構(gòu)化方式)通信
2絮蒿、Between Controller and Model
  • Controller對Model的訪問完全不受限制尊搬,Model只能被獲取
    Model中數(shù)據(jù)的改變,例如數(shù)據(jù)變化土涝、數(shù)據(jù)庫變化或者模型是某種網(wǎng)絡(luò)數(shù)據(jù)庫佛寿,一旦發(fā)生變化,Model通過notification/KVO發(fā)出類似廣播一樣的通知但壮,只有使用到該Model的Controller才會接受該廣播
3冀泻、Between Model and View
  • Model完全獨立于View,互相之間一無所知
  • iOS開發(fā)中蜡饵,開發(fā)人員最好不要讓View具備接收Model廣播的能力弹渔,因為這可能會違反MVC。

總結(jié)溯祸,在iOS開發(fā)中肢专,我們以一個滾動視圖scrollView為例巾乳,當(dāng)View開始滾動,View先向Controller詢問鸟召,“我是否可以滾”胆绊,被允許后,視圖開始滾動欧募,并向Controller索要數(shù)據(jù)压状,Controller轉(zhuǎn)向Model獲取數(shù)據(jù),拿到數(shù)據(jù)后跟继,通過dataSource把數(shù)據(jù)交給View顯示种冬。

Advantages and disadvantages


  • MVC僅僅是一種設(shè)計模式,MVC的好處在于分離了關(guān)注點舔糖,我們可以最大限度的重復(fù)利用代碼娱两,自動化UI測試也成為可能,大量的代碼被移到單獨的類文件管理金吗。(所以不要再談MVC能夠為應(yīng)用提高多少性能上的優(yōu)化十兢,也不要讓我通過一個demo的功能演示來描述什么是MVC )
  • MVC的缺點是由于它沒有明確的定義,所以完全理解MVC并不是很容易摇庙。使用MVC需要精心的計劃旱物,由于它的內(nèi)部原理比較復(fù)雜,所以需要花費一些時間去思考卫袒。你將不得不花費相當(dāng)可觀的時間去考慮如何將MVC運用到你的應(yīng)用程序宵呛,同時由于模型和視圖要嚴格的分離,這樣也給調(diào)試應(yīng)用程序帶來了一定的困難夕凝。每個構(gòu)件在使用之前都需要經(jīng)過徹底的測試宝穗。一旦你的構(gòu)件經(jīng)過了測試,你就可以毫無顧忌的重用它們了码秉。
  • 根據(jù)開發(fā)者經(jīng)驗逮矛,由于開發(fā)者將一個應(yīng)用程序分成了三個部件,所以使用MVC同時也意味著你將要管理比以前更多的文件泡徙,這一點是顯而易見的橱鹏。這樣好像我們的工作量增加了,但是請記住這比起它所能帶給我們的好處是不值一提堪藐。
  • MVC并不適合小型甚至中等規(guī)模的應(yīng)用程序莉兰,花費大量時間將MVC應(yīng)用到規(guī)模并不是很大的應(yīng)用程序,通常會得不償失礁竞。

我們對于 MVC 這種設(shè)計模式真的用得好嗎糖荒?其實不是的,MVC 這種分層方式雖然清楚模捂,但是如果使用不當(dāng)捶朵,很可能讓大量代碼都集中在 Controller 之中蜘矢,讓 MVC 模式變成了 Massive View Controller 模式。

Ligher ViewControllers


常見的瘦身方法:

  • 將數(shù)據(jù)獲取和轉(zhuǎn)換的邏輯综看,抽取出一個類
  • 將拼接空間的邏輯品腹,抽取出一個類

具體抽取哪些邏輯呢?

  • 將網(wǎng)絡(luò)請求抽取到單獨的類中:將網(wǎng)絡(luò)請求與具體的第三方依賴庫隔離红碑,方便更換底層的網(wǎng)絡(luò)庫
  • 界面的拼裝抽取到專門的類中:將能夠復(fù)用的控件封裝到一個類中舞吭,缺點是需要將控件的時間回調(diào)給Controller
  • 專門構(gòu)造存儲類:數(shù)據(jù)的存儲放到專門的類中,方便使用的同時析珊,可以針對存取做額外的事情羡鸥,例如,對一些熱點數(shù)據(jù)進行緩存等操作忠寻、數(shù)據(jù)遷移及切換存儲底層等惧浴。
累了!休息一下奕剃!

這里是休息區(qū)~~~比如衷旅,逗逗狗、擼一把...


MVC衍生的MVVM 架構(gòu)


MVVM是Model-View-ViewModel的簡稱祭饭,MVVM模式依賴于數(shù)據(jù)綁定,能自動將對象屬性和UI controls相聯(lián)系是其框架級的特性芜茵。舉個栗子叙量,在微軟的WPF框架里倡蝙,ViewModel將TextField里的Text屬性和Username屬性綁定,如下所示:

<TextField Text=”{DataBinding Path=Username, Mode=TwoWay}”/>

WPF框架將兩個屬性綁定在一起绞佩。TwoWay綁定確保ViewModel中的Username屬性改變時會為TextField的Text屬性改變做準備,而且可逆.例如用戶輸入時ViewModel的變化寺鸥。另一個例子是著名的基于MVVM的網(wǎng)頁框架Knockout,你可以在動作里看到相似的綁定特性:

<input data-bind=”value: username”/>

上面將HTML元素的一個屬性和JavaScript模型綁定品山。
遺憾的是,iOS缺乏數(shù)據(jù)綁定的框架胆建,但這正是ReactiveCocoa所扮演的角色:進行ViewModel連接"粘合"工作。從iOS開發(fā)的角度來看MVVM模式肘交,ViewController和其相關(guān)的UI(無論是nib笆载、storyboard或者純代碼組成的View)通過ReactiveCocoa將它們綁定在一起。

MVVMReactiveCocoa.png

例如涯呻,我們創(chuàng)建一個ViewModel的新實例凉驻,繼而構(gòu)建和返回View。以下代碼作用為初始化應(yīng)用的navigation controller.

- (UIViewController *)createInitialViewController {
 self.viewModel = [RWTFlickrSearchViewModel new]; 
 return [[RWTFlickrSearchViewController alloc] initWithViewModel:self.viewModel];
}

總結(jié)复罐,MVVM是一種設(shè)計架構(gòu)涝登,或者說是一種程序設(shè)計思想。MVVM中將ViewModel與View之間進行雙向數(shù)據(jù)綁定效诅。至于如何實現(xiàn)綁定胀滚,在iOS中采用的是ReactiveCocoa趟济,使View擁有對ViewModel的引用,兩者進行綁定咽笼。使兩者得到同步顷编。另外,ReactiveCocoa 經(jīng)常在ViewModel里來監(jiān)測它本身狀態(tài)來進行其它操作剑刑」葱В【結(jié)束:ReactiveCocoa單獨成章介紹】

【學(xué)習(xí)鏈接】
MVVM與ReactiveCocoa的運用
MVVM Tutorial with ReactiveCocoa

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叛甫,隨后出現(xiàn)的幾起案子层宫,更是在濱河造成了極大的恐慌,老刑警劉巖其监,帶你破解...
    沈念sama閱讀 210,835評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萌腿,死亡現(xiàn)場離奇詭異,居然都是意外死亡抖苦,警方通過查閱死者的電腦和手機毁菱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,900評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锌历,“玉大人贮庞,你說我怎么就攤上這事【课鳎” “怎么了窗慎?”我有些...
    開封第一講書人閱讀 156,481評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卤材。 經(jīng)常有香客問我遮斥,道長,這世上最難降的妖魔是什么扇丛? 我笑而不...
    開封第一講書人閱讀 56,303評論 1 282
  • 正文 為了忘掉前任术吗,我火速辦了婚禮,結(jié)果婚禮上帆精,老公的妹妹穿的比我還像新娘较屿。我一直安慰自己,他們只是感情好卓练,可當(dāng)我...
    茶點故事閱讀 65,375評論 5 384
  • 文/花漫 我一把揭開白布隘蝎。 她就那樣靜靜地躺著,像睡著了一般昆庇。 火紅的嫁衣襯著肌膚如雪末贾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,729評論 1 289
  • 那天整吆,我揣著相機與錄音拱撵,去河邊找鬼辉川。 笑死,一個胖子當(dāng)著我的面吹牛拴测,可吹牛的內(nèi)容都是我干的乓旗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,877評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼集索,長吁一口氣:“原來是場噩夢啊……” “哼屿愚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起务荆,我...
    開封第一講書人閱讀 37,633評論 0 266
  • 序言:老撾萬榮一對情侶失蹤妆距,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后函匕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娱据,經(jīng)...
    沈念sama閱讀 44,088評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,443評論 2 326
  • 正文 我和宋清朗相戀三年盅惜,在試婚紗的時候發(fā)現(xiàn)自己被綠了中剩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,563評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡抒寂,死狀恐怖结啼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屈芜,我是刑警寧澤郊愧,帶...
    沈念sama閱讀 34,251評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站沸伏,受9級特大地震影響糕珊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毅糟,卻給世界環(huán)境...
    茶點故事閱讀 39,827評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澜公。 院中可真熱鬧姆另,春花似錦、人聲如沸坟乾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,712評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甚侣。三九已至明吩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間殷费,已是汗流浹背印荔。 一陣腳步聲響...
    開封第一講書人閱讀 31,943評論 1 264
  • 我被黑心中介騙來泰國打工低葫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人仍律。 一個月前我還...
    沈念sama閱讀 46,240評論 2 360
  • 正文 我出身青樓嘿悬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親水泉。 傳聞我的和親對象是個殘疾皇子善涨,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,435評論 2 348

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