架構(gòu)設(shè)計(jì)-mvp實(shí)戰(zhàn)

MVP

概念

是MVC模式的一個演化版本,全稱Model-View-Presenter幔烛。

Model:主要提供數(shù)據(jù)的存儲功能囚戚,一般都是用來封裝網(wǎng)絡(luò)獲取的json數(shù)據(jù)的集合。Presenter通過調(diào)用Model進(jìn)行對象交互

View:這個View可以是viewcontroller、view等控件倦始。Presenter通過向View傳model數(shù)據(jù)進(jìn)行交互。

Presenter:作為model和view的中間人山卦,從model層獲取數(shù)據(jù)之后傳給view鞋邑,使得View和model沒有耦合

好處

Presenter:作為model和view的中間人,從model層獲取數(shù)據(jù)之后傳給view账蓉,使得View和model沒有耦合

View不直接與Model交互枚碗,而是通過與Presenter交互來與Model間接交互。

Presenter與View的交互是通過接口來進(jìn)行的铸本。

通常View與Presenter是一對一的肮雨,但復(fù)雜的View可能綁定多個Presenter來處理邏輯。

概念圖

1.png

邏輯圖

2.png

實(shí)際項(xiàng)目思路圖

![Uploading 3_964006.png . . .]

項(xiàng)目文件結(jié)構(gòu)

3.png

看出一個模塊有4個文件夾,model
![Uploading 4_975977.png . . .]
,controller,presenter,view

home的HomePresenter 繼承與基本的presenter箱玷,是根據(jù)home的業(yè)務(wù)實(shí)現(xiàn)的presenter

項(xiàng)目關(guān)鍵代碼截圖

網(wǎng)絡(luò)層

httpClient 數(shù)據(jù)請求部分


typedef NS_ENUM(NSInteger, HTTPRequstType) {
    HTTPRequstNothing,
    HTTPRequstHomeList,
};

@protocol HttpResponseHandle;

@interface HttpClient : NSObject

/*
 *方法名稱:initWithResponseHandle:
 *方法描述:初始化函數(shù)
 *輸入?yún)?shù):(id<HttpResponseHandle>) responseHandle:解析delegate
 *返回值:HttpClient 對象
 */
-(instancetype)initWithResponseHandle:(id<HttpResponseHandle>) responseHandle;

/*
 *方法名稱:requstDataWithType:info:
 *方法描述:根據(jù)接口的枚舉請求數(shù)據(jù)
 *輸入?yún)?shù):type:接口枚舉值怨规,info:參數(shù)字典
 *返回值:nil
 */
- (void)requstDataWithType:(HTTPRequstType)type info:(NSDictionary *)dic;

HttpResponseHandle:響應(yīng)解析器部分

@protocol HttpResponseHandle <NSObject>

@required

/*
 *方法名稱:requestSuccess:
 *方法描述:請求成功
 *輸入?yún)?shù):responseDic:數(shù)據(jù)對象
 *返回值:nil
 */
- (void)requestSuccess:(NSDictionary* )responseDic;

/*
 *方法名稱:requstFailWithErrcode:des:
 *方法描述:請求失敗
 *輸入?yún)?shù):errorCode:錯誤代碼 errorStr:錯誤描述
 *返回值:nil
 */


- (void)requstFailWithErrcode:(NSInteger)errCode des:(NSString*)errorStr;

HttpPresenter:外界訪問網(wǎng)絡(luò)數(shù)據(jù)接口

擁有httpClient ,實(shí)現(xiàn)請求響應(yīng)器方法锡足,實(shí)際什么也不做波丰,目的是讓其UI層的子類重寫

@interface HttpPresenter<E> : Presenter<E> <HttpResponseHandle>

@property (nonatomic,strong)HttpClient *httpClient;

@end

UI層

HomeModel模型文件

HomeViewProtocol:頁面屬性代理

HomePresenter:

繼承與httpPresent,提高對應(yīng)V的數(shù)據(jù)請求接口,
重寫數(shù)據(jù)響應(yīng)器方法舶得,在方法中通知模型組建對象掰烟,并使用新model刷新V

#import "HttpPresenter.h"


/*
 *被homeCon擁有, 實(shí)現(xiàn)網(wǎng)絡(luò)請求響應(yīng)器HttpResponseHandle,
 *并調(diào)用homeCon的數(shù)據(jù)刷新方法來刷新homeCon
 */
@interface HomePresenter : HttpPresenter 

/*
 *方法名稱:getHomeList:
 *方法描述:獲取首頁列表數(shù)據(jù)
 *輸入?yún)?shù):nil
 *返回值:nil
 */

- (void)getHomeList;
#pragma mark - HttpResponseHandle

- (void)requestSuccess:(NSDictionary *)responseDic
{
    /*
     *根據(jù)網(wǎng)絡(luò)請求結(jié)果構(gòu)建首頁模型
     */
    HomeModel *homeModel = [[HomeModel alloc] initWithDic:responseDic];
    if(homeModel )
    {
        if(_view  && [_view respondsToSelector:@selector(onGetHomeListSuccess:)])
        {
            [_view onGetHomeListSuccess:homeModel];
        }
    }
    else
    {
        if (_view && [_view respondsToSelector:@selector(OnGetHomeListFail:des:)])
        {
            [_view OnGetHomeListFail:0 des:@"暫無數(shù)據(jù)"];
        }
        
    }
    
    
}

范型基類(Presenter)

弱飲用V.提供P的初始化方法

@interface Presenter<E> : NSObject
{
    //MVP中負(fù)責(zé)更新的視圖沐批,可能是viewcon 也可能是view
    //因?yàn)関iew 強(qiáng)引用 presenter 故此處用weak
    __weak E _view;
}

/*
 *方法名稱:initWithView:
 *方法描述:初始化函數(shù)
 *輸入?yún)?shù):view:負(fù)責(zé)更新的視圖
 *返回值:Presenter 對象
 */
- (instancetype)initWithView:(E) view;

MVP總結(jié)

mvp 真正的打斷了了m v 的交互纫骑,

通過p作為中間橋梁,p請求數(shù)據(jù)珠插,然后組建模型惧磺,通知v 刷新,

v 可以是viewcontroller 也可以是view 捻撑,而且v與p一一對應(yīng)磨隘,是將部分的v的業(yè)務(wù)邏輯放入p中處理缤底,并且v不處理任何數(shù)據(jù),只負(fù)責(zé)視圖展示和通過新的模型數(shù)據(jù)刷新番捂,

對于一些v的操作个唧,可以直接發(fā)送給p處理,p主要處理業(yè)務(wù)邏輯设预,v僅僅負(fù)責(zé)展示和刷新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徙歼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鳖枕,更是在濱河造成了極大的恐慌魄梯,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宾符,死亡現(xiàn)場離奇詭異酿秸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)魏烫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門辣苏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哄褒,你說我怎么就攤上這事稀蟋。” “怎么了呐赡?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵退客,是天一觀的道長。 經(jīng)常有香客問我罚舱,道長井辜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任管闷,我火速辦了婚禮,結(jié)果婚禮上窃肠,老公的妹妹穿的比我還像新娘包个。我一直安慰自己,他們只是感情好冤留,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布碧囊。 她就那樣靜靜地躺著,像睡著了一般纤怒。 火紅的嫁衣襯著肌膚如雪糯而。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天泊窘,我揣著相機(jī)與錄音熄驼,去河邊找鬼像寒。 笑死,一個胖子當(dāng)著我的面吹牛瓜贾,可吹牛的內(nèi)容都是我干的诺祸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼祭芦,長吁一口氣:“原來是場噩夢啊……” “哼筷笨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起龟劲,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胃夏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昌跌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仰禀,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年避矢,在試婚紗的時候發(fā)現(xiàn)自己被綠了悼瘾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡审胸,死狀恐怖亥宿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情砂沛,我是刑警寧澤烫扼,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站碍庵,受9級特大地震影響映企,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜静浴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一堰氓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苹享,春花似錦双絮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宫纬,卻和暖如春焚挠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漓骚。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工蝌衔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榛泛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓胚委,卻偏偏與公主長得像挟鸠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子亩冬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評論 2 359

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