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來處理邏輯。
概念圖
邏輯圖
實(shí)際項(xiàng)目思路圖
項(xiàng)目文件結(jié)構(gòu)
看出一個模塊有4個文件夾,model
![Uploading 4_975977.png . . .]
,controller,presenter,viewhome的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é)展示和刷新