前言
隨著移動(dòng)互聯(lián)網(wǎng)承載著越來(lái)越錯(cuò)綜復(fù)雜的業(yè)務(wù)铛楣,傳統(tǒng)的MVC已經(jīng)不能完全滿足我們的需求,于是就出現(xiàn)了MVVM明肮、MVP菱农、VIPER等架構(gòu)。其中晤愧,最廣為人知的是MVVM大莫,雖說(shuō)上手沒(méi)那么容易,但是出于它能為controller減壓的優(yōu)越性官份,被廣泛使用只厘。因此烙丛,關(guān)于MVVM的文章比比皆是。
或許很多同學(xué)都會(huì)取出各架構(gòu)的優(yōu)越性羔味,結(jié)合產(chǎn)品的業(yè)務(wù)來(lái)搭建架構(gòu)河咽。比如猿題庫(kù)的MVC+VM架構(gòu),利用MVC的易讀性加上一層對(duì)數(shù)據(jù)的處理層赋元,也能大大減小controller的負(fù)擔(dān)忘蟹。MVP實(shí)際用起來(lái)確實(shí)沒(méi)有MVVM用起來(lái)效果明顯,但是不排除有小伙伴的公司業(yè)務(wù)用MVP會(huì)比較合適搁凸,但是目前關(guān)于iOS MVP架構(gòu)的文章并不多媚值。我們來(lái)談?wù)拢?/p>
MVP
MVP模式是MVC模式的一個(gè)演化版本(好像所有的模式都是出自于MVC~~),MVP全稱Model-View-Presenter护糖。顧名思義褥芒,
Model:與MVC中的model沒(méi)有太大的區(qū)別。主要提供數(shù)據(jù)的存儲(chǔ)功能嫡良,一般都是用來(lái)封裝網(wǎng)絡(luò)獲取的json數(shù)據(jù)的集合锰扶。Presenter通過(guò)調(diào)用Model進(jìn)行對(duì)象交互鹤盒。
View:這里的View與MVC中的V又有一些小差別喘批,這個(gè)View可以是viewcontroller碱妆、view等控件拓轻。Presenter通過(guò)向View傳model數(shù)據(jù)進(jìn)行交互。
Presenter:作為model和view的中間人乳讥,從model層獲取數(shù)據(jù)之后傳給view考蕾,使得View和model沒(méi)有耦合掖肋。
說(shuō)了那么多痴怨,總得來(lái)說(shuō)MVP的好處就是解除view與model的耦合忙干,使得view或model有更強(qiáng)的復(fù)用性。
上一下MVP的概念圖:
下面我們結(jié)合代碼來(lái)看:
首先來(lái)看項(xiàng)目的文件結(jié)構(gòu):
代碼給出了一個(gè)控制器作為例子浪藻,大家可以看到,home里面包含了四個(gè)文件夾乾翔,model爱葵、controller、presenter反浓、view萌丈。home當(dāng)中的HomePresenter是繼承presenter的,HomePresenter根據(jù)業(yè)務(wù)的不同來(lái)實(shí)現(xiàn)自己的presenter雷则。
網(wǎng)絡(luò)
網(wǎng)絡(luò)的底層還是用AFNetWorking來(lái)實(shí)現(xiàn)辆雾,HttpClient具體的封裝大概為
這里說(shuō)明一下,這里用delegate而不用block做回調(diào)是因?yàn)楹竺娴腍omePresenter需要對(duì)返回的數(shù)據(jù)進(jìn)行處理月劈,為了然后結(jié)構(gòu)更加清晰度迂,遵守一個(gè)函數(shù)一個(gè)功能的原則藤乙。后面還會(huì)再說(shuō)一下。HttpClient提供了賦值responseHandle的init函數(shù)惭墓,外部可以通過(guò)init函數(shù)來(lái)綁定responseHandle協(xié)議坛梁。
再來(lái)看一下上面那個(gè)responseHandle這個(gè)proctocol的結(jié)構(gòu):
目前只寫了success和fail兩個(gè)回調(diào),這里為了方便演示腊凶,只寫了一個(gè)參數(shù)划咐,這個(gè)一塊大伙可以根據(jù)自己的業(yè)務(wù)需求來(lái)寫。
結(jié)合HttpClient來(lái)看一下钧萍,我們分別在AFNetWorking請(qǐng)求成功褐缠、失敗的回調(diào)當(dāng)中處理delegate。簡(jiǎn)單說(shuō)风瘦,HttpResponseHandle就是嫁接presenter和HttpClient的協(xié)議~~
接下來(lái)看一下父類Presenter的設(shè)計(jì)队魏。先看接口:
這里采用了泛型,簡(jiǎn)單說(shuō)泛型就是有點(diǎn)類似objective-c中的id類型弛秋,大伙可以自行Google一下器躏。父類Presenter主要是提供綁定View和解綁View的功能。
基于網(wǎng)絡(luò)請(qǐng)求設(shè)計(jì)的HttpPresenter蟹略,HttpPresenter繼承與Presenter登失,遵守HttpResponseHandle協(xié)議,并且擁有自己的泛型挖炬,HttpClient成員變量揽浙。供外部調(diào)用HttpClient,降低耦合性意敛。
應(yīng)用
大致就可以分為這幾層了馅巷,看一下怎么應(yīng)用到實(shí)例中。
上文的文件目錄中可以看出我們每個(gè)功能模塊都有presenter這個(gè)文件夾草姻,對(duì)每個(gè)模塊的presenter都是為這個(gè)模塊服務(wù)钓猬,我們可以把請(qǐng)求、儲(chǔ)存數(shù)據(jù)的活動(dòng)放在這里撩独。并且在這層presenter中處理model數(shù)據(jù)敞曹。為了使controller得到的數(shù)據(jù)能直接使用,可以多寫一個(gè)protocol综膀,來(lái)承上啟下澳迫,HomeViewProtocol就為了這個(gè)產(chǎn)生。
@protocol HomeViewProtocol
- (void)onGetMovieListSuccess:(HomeModel*)homeModel;
- (void)onGetMovieListFail:(NSInteger) errorCode des:(NSString*)des;
@end
先看了protocol剧劝,HomePresenter看起來(lái)就清晰多了吧
在看一下controller的調(diào)用橄登,初始化HomePresenter,然后綁定一下自己的視圖,
遵循HomeViewProtocol
db
db這層也簡(jiǎn)單的封裝了一下fmdb拢锹,代碼已更新谣妻。
結(jié)尾
后續(xù)用MVP來(lái)搭一個(gè)基礎(chǔ)組件。
如果同學(xué)們有更好的方案面褐,隨時(shí)歡迎指正~
附上github地址:https://github.com/baoshanf/MVP-iOS