理解面向協(xié)議,以及 面向協(xié)議簡單應(yīng)用

關(guān)于面向協(xié)議的介紹在百度上介紹的很多,也有比較不錯的文章,這篇就很不錯

先來看一下實(shí)現(xiàn)效果

實(shí)現(xiàn)效果圖.png

首頁控制器只有不到80行代碼就將效果實(shí)現(xiàn)了,是不是對控制器代碼的復(fù)雜程度大大減少了不少呢。此demo中用的的所有東西皆由268教育集團(tuán)提供,首頁也是模仿《268新課題》軟件首頁實(shí)現(xiàn)的,大家可以在App Store搜索一下,一款很不錯的軟件。如果有違反268的規(guī)定我會立即刪除文章和demo,demo內(nèi)容嚴(yán)禁私自盜用。

因?yàn)榫W(wǎng)上關(guān)于這方面的demo很少,大部分是理論,也不適合初學(xué)者,我根據(jù)自己的理解寫了個簡單的demo,寫的很渣,高手請繞路。點(diǎn)擊下載demo

關(guān)于MVC理解:

第一次聽MVC概念還是面試的時候,面試官問我寫項(xiàng)目的時候一般用什么模式寫的,excuse?剛培訓(xùn)出來不懂啊胡亂說一通,后來在網(wǎng)上簡單查了一下MVC到底是啥也沒有深入的去了解它到底該怎么用,如何劃分層次.現(xiàn)在做開發(fā)已經(jīng)有一段時間了,對MVC的概念以及用法已經(jīng)有了一定的理解.

MVC模型-視圖-控制器(Model-View-Controller)

模型(Model)

一般模型對象里面放的是數(shù)據(jù)請求的屬性,一般我們是這么寫的,而.m里面則什么都沒有.如果你沒有用Masonry或SDAutolayout來自動布局的話可能還需要計(jì)算一下視圖布局,view中的控件的fream來不是在view中來計(jì)算的而是在model中就已經(jīng)計(jì)算好了,對于這部分希望你看一下這個demo下載demo.這個里面利用是YYKit框架去實(shí)現(xiàn)計(jì)算字符的寬高的,有興趣的可以自己寫一個NSMuttableAttstring屬性擴(kuò)展,也可以達(dá)到相同的目的

View

一般都都是一些子類化界面,比如自定義cell的視圖,tableView的headView等等,這里沒什么好說的

控制器Control

用來控制一個或多個視圖對象和一個或多個模型對象之間關(guān)系,控制器對象因此是同步管道程序,通過它,視圖對象了解模型對象的更改,控制器對象還可以為應(yīng)用程序執(zhí)行設(shè)置和協(xié)調(diào)任務(wù),并管理其他對象的生命周期

控制器對象解釋在視圖對象中進(jìn)行的用戶操作,并將新的或更改過的數(shù)據(jù)傳達(dá)給模型對象。模型對象更改時,一個控制器對象會將新的模型數(shù)據(jù)傳達(dá)給視圖對象,以便視圖對象可以顯示它.M和V永遠(yuǎn)不能相互通信,只能通過控制器傳遞??刂破骺梢灾苯优cModel對話(讀寫調(diào)用Model),控制器可以直接與View對話,通過接口,直接操作View,接口直接對應(yīng)到View中的控件,View通過action向控制器報告事件的發(fā)生(如用戶的點(diǎn)擊事件)??刂破魇荲iew的直接數(shù)據(jù)源(數(shù)據(jù)很可能是控制器從Model中取得并經(jīng)過加工了)??刂破魇荲iew的代理(delegate),以同步View與Controller。

層次分完了,很完美,但是網(wǎng)絡(luò)請求放哪里?你可能試著把它放在Model對象里,但是也會很棘手,因?yàn)榫W(wǎng)絡(luò)調(diào)用應(yīng)該使用異步,這樣如果一個網(wǎng)絡(luò)請求比持有它的Model生命周期更長,事情將變的復(fù)雜(這段話是網(wǎng)上說的,具體會出啥結(jié)果我還沒有得到驗(yàn)證,我一般都是把網(wǎng)絡(luò)請求放入model中).顯然也不應(yīng)該把網(wǎng)絡(luò)代碼放在view里,因此只剩下控制器了,因?yàn)檫@加劇了厚重控制器的問題。

基于MVC理解使用MVVM

Model-View-ViewModel 在MVVM里,view和viewcontroller正式聯(lián)系在一起,我們把它們視為一個組件。視圖view仍然不能直接引用模型Model,當(dāng)然controller也不能。相反,他們引用視圖模型view Model。view Model是一個放置用戶輸入驗(yàn)證邏輯,視圖顯示邏輯,發(fā)起網(wǎng)絡(luò)請求和其他各種各樣的代碼的極好的地方,由于展示邏輯(presentation logic)放在了view Model中(比如Model的值映射到一個格式化的字符串),視圖控制器本身就會不再臃腫。當(dāng)你開始使用MVVM的最好方式是,可以先將一小部分邏輯放入視圖模型,然后當(dāng)你逐漸習(xí)慣于使用這個范式的時候再遷移更多的邏輯到視圖模型中.以我寫項(xiàng)目的經(jīng)驗(yàn),使用MVVM會輕微的增加代碼量,但總體上減少了代碼的復(fù)雜性。

基于面向協(xié)議MVP的介紹

MVP到底是什么? M : 邏輯Model層 V : 視圖層 P : protocol協(xié)議層 其實(shí)MVVM已經(jīng)把層次分的很清楚了,VM將邏輯層和網(wǎng)絡(luò)層給分離出來,那為什么又多出來個協(xié)議層呢? 視圖顯示大部分是基于協(xié)議去實(shí)現(xiàn)的,比如tableviewdelegate和tabledatasource協(xié)議,如果有兩個頁面有tableview都需要將協(xié)議實(shí)現(xiàn)一遍,不感覺有點(diǎn)重復(fù)造輪子了嗎?如果將協(xié)議抽離出來封裝成對象去實(shí)現(xiàn),那只需要寫一個就可以了啊,理想情況下是這樣的,可是項(xiàng)目中每個頁面也總不能都長一樣吧,這也只能應(yīng)用于簡單的項(xiàng)目,有相似度的頁面,我在網(wǎng)上查資料的時候,有人把事件操作(比如點(diǎn)擊事件)也封裝到了Model中,我認(rèn)為這是不是很好,控件肯定都是在view層,如果實(shí)現(xiàn)事件響應(yīng)也是通過view層去block或代理去實(shí)現(xiàn),如果把事件封裝給Model,再通過Model與控制器交互進(jìn)行事件響應(yīng),感覺比較繁瑣而且代碼也不易理解,這個看個人理解吧。因?yàn)镸VP概念是剛剛了解,用的地方不是很多,就簡單寫了個demo將協(xié)議從控制器中分離出來感覺很實(shí)用。demo是用swift寫的,本來是用OC,寫OC那個demo東西比較亂比較雜,正好自己在學(xué)swift所以就用swift去實(shí)現(xiàn)了一下。具體實(shí)現(xiàn)是在Home文件夾下。demo中有用到代理,block,擴(kuò)展等方法,很適合初學(xué)者來了解swift。

總的來說這篇寫的還是比較水的,剛開始介紹MVC模式來引申出來MVVM再到MVP后來寫著寫著把自己繞進(jìn)去了,總的來說MVP就是將協(xié)議層抽離出來,比較適用于tableView視圖和CollectionView視圖,將協(xié)議抽出來很大程度的減少了Control的代碼量,使Control變得非常清晰,控制器只實(shí)現(xiàn)代理事件和數(shù)據(jù)刷新加載,因?yàn)閐emo中沒有做數(shù)據(jù)的刷新,數(shù)據(jù)請求也是放到Model中去請求的,數(shù)據(jù)上拉加載更多的數(shù)據(jù)應(yīng)該是放在Control去實(shí)現(xiàn)的,我想這也比較合理的。學(xué)習(xí)MVP也沒有幾天所以用的不好,有的東西也分的不是很清楚,此demo只適用初學(xué)者高手請繞路。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容