關(guān)于面向協(xié)議的介紹在百度上介紹的很多,也有比較不錯(cuò)的文章,這篇就很不錯(cuò)
先來(lái)看一下實(shí)現(xiàn)效果
首頁(yè)控制器只有不到80行代碼就將效果實(shí)現(xiàn)了,是不是對(duì)控制器代碼的復(fù)雜程度大大減少了不少呢脑沿。此demo中用的的所有東西皆由268教育集團(tuán)提供,首頁(yè)也是模仿《268新課題》軟件首頁(yè)實(shí)現(xiàn)的臭胜,大家可以在App Store搜索一下,一款很不錯(cuò)的軟件对竣。如果有違反268的規(guī)定我會(huì)立即刪除文章和demo庇楞,demo內(nèi)容嚴(yán)禁私自盜用榜配。
因?yàn)榫W(wǎng)上關(guān)于這方面的demo很少否纬,大部分是理論,也不適合初學(xué)者蛋褥,我根據(jù)自己的理解寫(xiě)了個(gè)簡(jiǎn)單的demo临燃,寫(xiě)的很渣,高手請(qǐng)繞路。點(diǎn)擊下載demo
關(guān)于MVC理解:
第一次聽(tīng)MVC概念還是面試的時(shí)候,面試官問(wèn)我寫(xiě)項(xiàng)目的時(shí)候一般用什么模式寫(xiě)的,excuse?剛培訓(xùn)出來(lái)不懂啊胡亂說(shuō)一通,后來(lái)在網(wǎng)上簡(jiǎn)單查了一下MVC到底是啥也沒(méi)有深入的去了解它到底該怎么用,如何劃分層次.現(xiàn)在做開(kāi)發(fā)已經(jīng)有一段時(shí)間了,對(duì)MVC的概念以及用法已經(jīng)有了一定的理解.
MVC模型-視圖-控制器(Model-View-Controller)
模型(Model)
一般模型對(duì)象里面放的是數(shù)據(jù)請(qǐng)求的屬性,一般我們是這么寫(xiě)的,而.m里面則什么都沒(méi)有.如果你沒(méi)有用Masonry或SDAutolayout來(lái)自動(dòng)布局的話可能還需要計(jì)算一下視圖布局,view中的控件的fream來(lái)不是在view中來(lái)計(jì)算的而是在model中就已經(jīng)計(jì)算好了,對(duì)于這部分希望你看一下這個(gè)demo下載demo.這個(gè)里面利用是YYKit框架去實(shí)現(xiàn)計(jì)算字符的寬高的,有興趣的可以自己寫(xiě)一個(gè)NSMuttableAttstring屬性擴(kuò)展,也可以達(dá)到相同的目的
View
一般都都是一些子類化界面,比如自定義cell的視圖,tableView的headView等等,這里沒(méi)什么好說(shuō)的
控制器Control
用來(lái)控制一個(gè)或多個(gè)視圖對(duì)象和一個(gè)或多個(gè)模型對(duì)象之間關(guān)系,控制器對(duì)象因此是同步管道程序,通過(guò)它,視圖對(duì)象了解模型對(duì)象的更改,控制器對(duì)象還可以為應(yīng)用程序執(zhí)行設(shè)置和協(xié)調(diào)任務(wù),并管理其他對(duì)象的生命周期
控制器對(duì)象解釋在視圖對(duì)象中進(jìn)行的用戶操作,并將新的或更改過(guò)的數(shù)據(jù)傳達(dá)給模型對(duì)象膜廊。模型對(duì)象更改時(shí),一個(gè)控制器對(duì)象會(huì)將新的模型數(shù)據(jù)傳達(dá)給視圖對(duì)象,以便視圖對(duì)象可以顯示它.M和V永遠(yuǎn)不能相互通信,只能通過(guò)控制器傳遞乏沸。控制器可以直接與Model對(duì)話(讀寫(xiě)調(diào)用Model),控制器可以直接與View對(duì)話,通過(guò)接口,直接操作View,接口直接對(duì)應(yīng)到View中的控件,View通過(guò)action向控制器報(bào)告事件的發(fā)生(如用戶的點(diǎn)擊事件)爪瓜〉旁荆控制器是View的直接數(shù)據(jù)源(數(shù)據(jù)很可能是控制器從Model中取得并經(jīng)過(guò)加工了)∶控制器是View的代理(delegate),以同步View與Controller蝶缀。
層次分完了,很完美,但是網(wǎng)絡(luò)請(qǐng)求放哪里?你可能試著把它放在Model對(duì)象里,但是也會(huì)很棘手,因?yàn)榫W(wǎng)絡(luò)調(diào)用應(yīng)該使用異步,這樣如果一個(gè)網(wǎng)絡(luò)請(qǐng)求比持有它的Model生命周期更長(zhǎng),事情將變的復(fù)雜(這段話是網(wǎng)上說(shuō)的,具體會(huì)出啥結(jié)果我還沒(méi)有得到驗(yàn)證,我一般都是把網(wǎng)絡(luò)請(qǐng)求放入model中).顯然也不應(yīng)該把網(wǎng)絡(luò)代碼放在view里,因此只剩下控制器了,因?yàn)檫@加劇了厚重控制器的問(wèn)題。
基于MVC理解使用MVVM
Model-View-ViewModel 在MVVM里,view和viewcontroller正式聯(lián)系在一起,我們把它們視為一個(gè)組件薄货。視圖view仍然不能直接引用模型Model,當(dāng)然controller也不能翁都。相反,他們引用視圖模型view Model。view Model是一個(gè)放置用戶輸入驗(yàn)證邏輯,視圖顯示邏輯,發(fā)起網(wǎng)絡(luò)請(qǐng)求和其他各種各樣的代碼的極好的地方,由于展示邏輯(presentation logic)放在了view Model中(比如Model的值映射到一個(gè)格式化的字符串),視圖控制器本身就會(huì)不再臃腫谅猾。當(dāng)你開(kāi)始使用MVVM的最好方式是,可以先將一小部分邏輯放入視圖模型,然后當(dāng)你逐漸習(xí)慣于使用這個(gè)范式的時(shí)候再遷移更多的邏輯到視圖模型中.以我寫(xiě)項(xiàng)目的經(jīng)驗(yàn),使用MVVM會(huì)輕微的增加代碼量,但總體上減少了代碼的復(fù)雜性柄慰。
基于面向協(xié)議MVP的介紹
MVP到底是什么? M : 邏輯Model層 V : 視圖層 P : protocol協(xié)議層 其實(shí)MVVM已經(jīng)把層次分的很清楚了,VM將邏輯層和網(wǎng)絡(luò)層給分離出來(lái),那為什么又多出來(lái)個(gè)協(xié)議層呢? 視圖顯示大部分是基于協(xié)議去實(shí)現(xiàn)的,比如tableviewdelegate和tabledatasource協(xié)議,如果有兩個(gè)頁(yè)面有tableview都需要將協(xié)議實(shí)現(xiàn)一遍,不感覺(jué)有點(diǎn)重復(fù)造輪子了嗎?如果將協(xié)議抽離出來(lái)封裝成對(duì)象去實(shí)現(xiàn),那只需要寫(xiě)一個(gè)就可以了啊,理想情況下是這樣的,可是項(xiàng)目中每個(gè)頁(yè)面也總不能都長(zhǎng)一樣吧,這也只能應(yīng)用于簡(jiǎn)單的項(xiàng)目,有相似度的頁(yè)面税娜,我在網(wǎng)上查資料的時(shí)候坐搔,有人把事件操作(比如點(diǎn)擊事件)也封裝到了Model中,我認(rèn)為這是不是很好巧涧,控件肯定都是在view層薯蝎,如果實(shí)現(xiàn)事件響應(yīng)也是通過(guò)view層去block或代理去實(shí)現(xiàn),如果把事件封裝給Model谤绳,再通過(guò)Model與控制器交互進(jìn)行事件響應(yīng)占锯,感覺(jué)比較繁瑣而且代碼也不易理解,這個(gè)看個(gè)人理解吧缩筛。因?yàn)镸VP概念是剛剛了解消略,用的地方不是很多,就簡(jiǎn)單寫(xiě)了個(gè)demo將協(xié)議從控制器中分離出來(lái)感覺(jué)很實(shí)用瞎抛。demo是用swift寫(xiě)的艺演,本來(lái)是用OC,寫(xiě)OC那個(gè)demo東西比較亂比較雜桐臊,正好自己在學(xué)swift所以就用swift去實(shí)現(xiàn)了一下胎撤。具體實(shí)現(xiàn)是在Home
文件夾下。demo中有用到代理断凶,block伤提,擴(kuò)展等方法,很適合初學(xué)者來(lái)了解swift认烁。
總的來(lái)說(shuō)這篇寫(xiě)的還是比較水的肿男,剛開(kāi)始介紹MVC模式來(lái)引申出來(lái)MVVM再到MVP后來(lái)寫(xiě)著寫(xiě)著把自己繞進(jìn)去了介汹,總的來(lái)說(shuō)MVP就是將協(xié)議層抽離出來(lái),比較適用于tableView視圖和CollectionView視圖舶沛,將協(xié)議抽出來(lái)很大程度的減少了Control的代碼量嘹承,使Control變得非常清晰,控制器只實(shí)現(xiàn)代理事件和數(shù)據(jù)刷新加載如庭,因?yàn)閐emo中沒(méi)有做數(shù)據(jù)的刷新叹卷,數(shù)據(jù)請(qǐng)求也是放到Model中去請(qǐng)求的,數(shù)據(jù)上拉加載更多的數(shù)據(jù)應(yīng)該是放在Control去實(shí)現(xiàn)的坪它,我想這也比較合理的豪娜。學(xué)習(xí)MVP也沒(méi)有幾天所以用的不好,有的東西也分的不是很清楚哟楷,此demo只適用初學(xué)者高手請(qǐng)繞路瘤载。