iOS的 MVP模式 學(xué)習(xí)

這兩天時(shí)間寬松一點(diǎn)蟋座,所以我也來(lái)學(xué)學(xué)MVP的設(shè)計(jì)模式拗踢,有人說(shuō)是架構(gòu),管他呢向臀,好用就行巢墅。so,開(kāi)干券膀! 后邊有OC版本的demo

  1. 打開(kāi)了Google君纫,搜了一下關(guān)鍵字 MVP iOS,然后發(fā)現(xiàn)了一些文章芹彬,最后是這篇文章帶給我對(duì)MVP 的一些認(rèn)識(shí)蓄髓。
  2. MVP似乎有好多的變種,作者所說(shuō)的這種有如下特點(diǎn):
    (原文如下:)
    • the view part of the MVP consists of both UIViews and UIViewController
    • the view delegates user interactions to the presenter
    • the presenter contains the logic to handle user interactions
    • the presenter communicates with model layer, converts the data to UI friendly format, and updates the view
    • the presenter has no dependencies to UIKit
    • the view is passive (dump)
      稍微翻譯一下
    • MVP的 V 層是由UIViewController 和UIView 共同組成
    • view 將委托presenter 對(duì)它自己的操作雀监,(簡(jiǎn)單來(lái)說(shuō)就是presenter發(fā)命令來(lái)控制view的交互双吆,要你隱藏就隱藏,叫你show 你就乖乖的show)
    • presenter擁有對(duì) view交互的邏輯(就是上面說(shuō)的意思)
    • presenter跟model層通信会前,并將數(shù)據(jù)轉(zhuǎn)化成對(duì)適應(yīng)UI的數(shù)據(jù)并更新view
    • presenter不需要依賴(lài)UIKit
    • view層是單一好乐,因?yàn)樗潜粍?dòng)接受命令,沒(méi)有主動(dòng)能力

如下


The MVP pattern

presenter 作為業(yè)務(wù)邏輯的處理者瓦宜,首先要向model層拿數(shù)據(jù)蔚万,所以它將可以向model層通信。其次临庇,UI的處理權(quán)移交給了它反璃,所以它需要與view成通訊,發(fā)送命令改變UI假夺。同時(shí)淮蜈,UI的響應(yīng)將觸發(fā)業(yè)務(wù)邏輯的處理,所以view 層向presenter層通訊已卷,告訴他用戶(hù)做了什么操作梧田,需要你反饋對(duì)應(yīng)的數(shù)據(jù)來(lái)更新UI。這樣就完成了從用戶(hù)交互獲得交互反饋到整個(gè)業(yè)務(wù)邏輯侧蘸。

  1. 說(shuō)啥都是廢話(huà)裁眯,交出代碼,我們還能做朋友
    首先看下結(jié)構(gòu)
三個(gè)主要類(lèi)和一個(gè)協(xié)議

UserViewProtocol 協(xié)議定義了一下方法讳癌,這些方法其實(shí)就是presenter對(duì)view層發(fā)送的命令
#import <Foundation/Foundation.h>
@protocol UserViewProtocol <NSObject>
-(void) userViewDataSource:(NSArray*)data;
-(void) showIndicator;
-(void) hideIndicator;
-(void) showEmptyView;
@end

UserService 類(lèi)是用來(lái)請(qǐng)求數(shù)據(jù)給presenter的穿稳,也能算是model層吧。我就只定義了一個(gè)方法晌坤。

-(void)getUserInfosSuccess:(SuccessHandler )success andFail:(FailHandler) failure

這一層床牧,其實(shí)也可以很復(fù)雜,這就涉及網(wǎng)絡(luò)層的架構(gòu)了涩哟,可以去看看casatwy大神關(guān)于網(wǎng)絡(luò)層架構(gòu)的思路,我也正在學(xué)習(xí) 猜憎。

ViewController類(lèi)則是UI層娩怎,它實(shí)現(xiàn)了tableview自己的協(xié)議搔课,還實(shí)現(xiàn)了用戶(hù)交互的協(xié)議 UserViewProtocol,也就說(shuō)截亦,presenter向UI層發(fā)送命令爬泥,其實(shí)是發(fā)給UI層的viewController,實(shí)際上是控制器來(lái)被動(dòng)的更新UI崩瓤。這個(gè)不管是MVC還是MVP袍啡,view的實(shí)際控制權(quán)應(yīng)該都是viewController,這個(gè)理解應(yīng)該沒(méi)錯(cuò)吧却桶。
協(xié)議中的幾個(gè)方法實(shí)現(xiàn)如下境输。

-(void)userViewDataSource:(NSArray*)data{
 self.friendlyUIData = data;
 [self.tableview reloadData];
}
-(void) showIndicator{
 self.indicator.hidden = NO;
}
-(void) hideIndicator{
 self.indicator.hidden = YES;
}
-(void) showEmptyView{
 UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"Alert" message:@"show empty view" preferredStyle:UIAlertControllerStyleAlert];
 [alertView addAction:[UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:nil]];
 [self presentViewController:alertView animated:YES completion:^{
 }];
}

另外,在viewDidload中颖系,調(diào)用了presenter的兩個(gè)public 方法

 self.presenter = [Presenter new];
 [self.presenter attachView:self];
 [self.presenter fetchData];

那就來(lái)看看Presenter類(lèi)嗅剖,這個(gè)類(lèi)我在demo中加了不少的注釋?zhuān)饕菫榱死砬遄约旱乃悸?br> 先說(shuō)attachView 方法,這個(gè)方法是對(duì)外公開(kāi)的嘁扼,目的就是為了將實(shí)現(xiàn)了UserViewProtocol 協(xié)議的對(duì)象(其實(shí)應(yīng)該就是控制器信粮,因?yàn)関iew的直接操作者就是view Controller)綁定到presenter 上,說(shuō)白了就是presenter 可以直接拿到實(shí)現(xiàn)了UserViewProtocol 協(xié)議的對(duì)象趁啸,并且向他發(fā)送命令(協(xié)議實(shí)現(xiàn)的方法强缘,前面有說(shuō)到),具體該方法的實(shí)現(xiàn)

@interface Presenter()
@property (nonatomic,strong) UserService *userService;
@property (nonatomic,weak) id<UserViewProtocol> attachView;
@end
-(void)attachView:(id <UserViewProtocol>)view{
 self.attachView = view;
 self.userService  = [UserService new];
}

注意這里用了weak 來(lái)修飾attachView 樹(shù)形不傅,因?yàn)閜resenter和 viewController相互持有旅掂,所以必須要通過(guò)weak 來(lái)打破循環(huán)引用,這跟我們平時(shí)使用委托協(xié)議( delegate)是一樣的访娶,只是名字換成了attachView 而已商虐。

再來(lái)說(shuō)fetchData方法,公開(kāi)這個(gè)方法震肮,只是為了數(shù)據(jù)請(qǐng)求有個(gè)統(tǒng)一的接口称龙,而不需要presenter分開(kāi)多次調(diào)用,presenter自己處理所有事情戳晌,不讓viewController參和進(jìn)來(lái)鲫尊。具體實(shí)現(xiàn)就看demo

最后說(shuō)一下

-(NSArray *)processOriginDataToUIFriendlyData:(NSArray *) originData{
 NSMutableArray *friendlyUIData = [NSMutableArray new];
 for (NSDictionary *dic in originData) {
  if ([[dic valueForKey:@"gender"] isEqualToString:@"males"]) {
   [friendlyUIData addObject:dic];
  }
 }
 return friendlyUIData;
}

這個(gè)私有方法是將原始數(shù)據(jù)轉(zhuǎn)換成UI所需要的數(shù)據(jù),這樣UI拿到數(shù)據(jù)就可以直接使用沦偎,而不用做各種判斷疫向,邏輯依然放在了presenter中咳蔚。而且,這個(gè)數(shù)據(jù)處理可以做成協(xié)議搔驼,輸出不同UI需要的數(shù)據(jù)谈火,這個(gè)也可以看casatwy大神 關(guān)于view架構(gòu)的文章。

這就是我的一些簡(jiǎn)單理解舌涨!有錯(cuò)誤歡迎糾正糯耍。最后,還有demo沒(méi)上啊囊嘉,就想跑
demo在這里https://github.com/HecvStyle/MVPDemo

--------end--------

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末温技,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扭粱,更是在濱河造成了極大的恐慌舵鳞,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琢蛤,死亡現(xiàn)場(chǎng)離奇詭異蜓堕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)博其,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)套才,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贺奠,你說(shuō)我怎么就攤上這事霜旧。” “怎么了儡率?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵挂据,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我儿普,道長(zhǎng)崎逃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任眉孩,我火速辦了婚禮个绍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浪汪。我一直安慰自己巴柿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布死遭。 她就那樣靜靜地躺著广恢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呀潭。 梳的紋絲不亂的頭發(fā)上钉迷,一...
    開(kāi)封第一講書(shū)人閱讀 52,475評(píng)論 1 312
  • 那天至非,我揣著相機(jī)與錄音,去河邊找鬼糠聪。 笑死荒椭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舰蟆。 我是一名探鬼主播趣惠,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夭苗!你這毒婦竟也來(lái)了信卡?” 一聲冷哼從身側(cè)響起隔缀,我...
    開(kāi)封第一講書(shū)人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤题造,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后猾瘸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體界赔,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年牵触,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淮悼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揽思,死狀恐怖袜腥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钉汗,我是刑警寧澤羹令,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站损痰,受9級(jí)特大地震影響福侈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卢未,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一肪凛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辽社,春花似錦伟墙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至失息,卻和暖如春譬淳,著一層夾襖步出監(jiān)牢的瞬間档址,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工邻梆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留守伸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓浦妄,卻偏偏與公主長(zhǎng)得像尼摹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剂娄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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