日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

iOS中的MVP模式初探

瀏覽:21日期:2022-09-17 11:04:11

以前在項目中都寫的是MVC模式, 由于現在在項目中要學習MVP模式, 所以找了一個Demo研究了一下. 就簡單說說自己的看法吧.

先說一下MVC模式, 示意圖如下:

iOS中的MVP模式初探

MVC模式示意圖

模型拿到數據, 可能是數據庫或者網絡數據

最簡單的比方, 我們拿到一個模型數組了之后, 這個就相當于是一個數據源.

將數據傳遞給控制器, 控制器經過簡單地加工

數據源經過簡單地處理加工, 比如在tableView中, 我們可能會使用數據源方法, 將模型數組中的元素取出來, 傳遞給View層, 比如cell

將加工后的數據展示出來

cell展示模型中的數據

那么MVP模式又是怎樣的呢?請看下圖

iOS中的MVP模式初探

MVP模式示意圖

從上圖可以看出, 從MVC中又抽象出了P層, 即Presenter層

Controller其實將view和viewController傳遞給了P層, 這樣P層其實就擁有了控制器的權利, 完全可以行使控制器的職責.

Controller又持有Presenter, 那么它只需要調用P層暴露出的接口, 就完全可以完成整個業務邏輯和頁面展示

關于C端和P端的循環引用的問題, 直接用weak關鍵字就可以解決了

利用代碼來說明一下問題:

這是一個Presenter的Protocol, 所有的P層的類都要遵循這個Protocol

#import /** 作為P : presenter 是管理 view viewController model這個三個中間人,負責UI刷新 視圖的交互總是和VC 關聯著的 */@protocol TGPresenterProtocol @optional// 處理View視圖相關操作 -- 協議的遵守者- (void)setView:(NSObject *)view;// 處理事件的相關響應- (void)setViewController:(UIViewController *)viewController;// 展示- (void)present;// 加載model - (void)presentWithModel:(id)model viewController:(UIViewController *)viewController;@end

可以看出, P層是可以拿到view或者viewController的, 并且可以在實現set方法的時候做一些事情. 這個稍后再講

另外, P層還可以展示數據, 直接展示數據, present方法, 利用模型展示數據, 利用presentWithModel:方法

比如, 在一個遵循了TGPresenterProtocol的Presenter類中

把需要管理的view傳遞給P,

- (instancetype)initWithTableView:(UITableView *)view{self = [super init]; if (!self) {return nil; } _view = view; _view.delegate = self; _view.dataSource = self; _view.separatorStyle = UITableViewCellSeparatorStyleNone; // 自適應高度 _view.rowHeight = UITableViewAutomaticDimension; _view.estimatedRowHeight = 100; return self;}- (void)setView:(UITableView *)view{ // 設置視圖 _view = view; _view.delegate = self; _view.dataSource = self; _view.separatorStyle = UITableViewCellSeparatorStyleNone; // 自適應高度 _view.rowHeight = UITableViewAutomaticDimension; _view.estimatedRowHeight = 100;}

比如上面的代碼, 將tableView的數據源和代理都給了P, 那么P就相當于行使了控制器的權力, 當P層拿到數據時(沒錯, P層是持有Model的):

- (void)loadHPData{NSString *dataPath = [[NSBundle mainBundle] pathForResource:@'testCellData' ofType:@'json']; NSData *jsonData = [NSData dataWithContentsOfFile:dataPath]; NSError *error; NSDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error]; if (error) {NSLog(@'error = %@',error.localizedDescription); } NSLog(@'dataDic = %@',dataDic); // model 要處理好數據的顯示格式 self.hpModel = [[CellSelfSizeModel alloc] initWithDic:dataDic]; // 刷新 [self present]; }

走Present方法, 實際就是tableView的reloadData:

- (void)present{[self.view reloadData];}

然后重走tableView的數據源方法. 將數據分發給cell去展示:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return self.hpModel.data.listArray.count;}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{NSString *ID = @''; cellType type;CelllSelfSizeListModel *newsList; if (indexPath.row > self.hpModel.data.listArray.count - 1) {newsList = nil; }else{newsList = self.hpModel.data.listArray[indexPath.row]; } if (newsList.orginImg.length>0) {// 有圖片type = NewsInListCellTypeHavePic; }else{// 無圖片type = NewsInListCellTypeOnlyWord; }ID = [NSString stringWithFormat:@'reusId%ld',(long)type];SelfSizeTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) {cell = [[SelfSizeTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID cellType:type]; }cell.cellModel = newsList;return cell;}

這樣就實現了Controller, View, Model的解耦. 給大家看看控制器做的事情:

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view.self.title = @'MVP Demo';// 布局 [self initViews]; [self setUpConstraints];self.hpPresenter = [TGHPPresenter new]; // 視圖對象 self.hpPresenter.view = self.tableView; // 控制器對象 self.hpPresenter.viewController = self; // 外邊是要傳入參進去的 -- 數據模型 [self.hpPresenter loadHPData]; }

只需要初始化P層, 然后調P層的接口就可以了. 至于P層內部的邏輯, 我不需要知道

V層也只專注于視圖的創建

M層只專注于模型的構建(字典->模型)

這樣分層, 解耦的思想在程序設計中是極為重要的. 其實也可以看出MVP是對MVC模式的進一步抽象.

代碼Demo是我們老大寫的, 我只是分析了一波

來自:http://www.cocoachina.com/ios/20171106/21062.html

標簽: IOS
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
精品国产a一区二区三区v免费| 欧美日韩亚洲一区在线观看| 视频一区日韩精品| 欧美.日韩.国产.一区.二区| 99久久视频| 视频福利一区| 欧美~级网站不卡| 亚洲午夜精品久久久久久app| 九九精品调教| 久久国产精品成人免费观看的软件| 欧美羞羞视频| 亚洲欧美伊人| 国产精品嫩草99av在线| 蜜臀av国产精品久久久久| 日韩不卡手机在线v区| 日韩精彩视频在线观看| 欧美亚洲色图校园春色| 国产乱码精品| 精品国产乱码久久久| 国产乱码午夜在线视频| 欧美亚洲精品在线| 石原莉奈在线亚洲三区| 国产欧美日韩视频在线| 国内一区二区三区| 美女网站视频一区| 丝袜脚交一区二区| 91精品国产自产精品男人的天堂| 麻豆精品国产91久久久久久| 在线看片福利| 欧美午夜不卡| 日韩欧美2区| 开心激情综合| 婷婷激情久久| 丝袜a∨在线一区二区三区不卡| 日韩av中文字幕一区| 久久久久久色| 日本久久精品| 最新日韩av| 欧美日韩亚洲一区在线观看| 久久影院午夜精品| 亚洲少妇自拍| 国产精区一区二区| 日本美女一区| 亚洲精品成人一区| 日韩不卡一区| 免费观看在线综合| 国产伦精品一区二区三区视频 | 国产精品网在线观看| 日韩欧美三级| 亚洲九九精品| 日韩欧美一区免费| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产福利资源一区| 免费久久久久久久久| 久久国产欧美日韩精品| 在线视频观看日韩| 国产精品午夜一区二区三区| 婷婷激情一区| 青青国产精品| 欧美成人国产| 久久99精品久久久野外观看| 亚洲免费高清| 精品国产一区二| 蜜臀va亚洲va欧美va天堂| 国产精品久久久久久久久久10秀 | 亚洲人成网77777色在线播放| 国产一区二区三区天码| 国产精品毛片在线| 精品国产麻豆| 日本不卡高清视频| 国内精品福利| 国产一区二区色噜噜| 婷婷视频一区二区三区| 亚洲小说欧美另类婷婷| 精品伊人久久| 日韩在线麻豆| 欧美日韩国产免费观看| 成人国产精品一区二区免费麻豆| 亚洲色图综合| 久久久久中文| 精品一区视频| 欧美日韩一区二区高清| 九一国产精品| 精品国产欧美日韩一区二区三区| 免费日本视频一区| 久久精品成人| 国产成人久久精品一区二区三区| 日韩精品一区二区三区中文| 午夜日韩福利| 欧洲亚洲一区二区三区| 久久精品国产精品亚洲毛片| 日韩国产一区二| 丝袜美腿亚洲一区二区图片| 久久国产中文字幕| 免费一二一二在线视频| 久久麻豆视频| 国产精品夜夜夜| 亚洲人成精品久久久| 99综合视频| 欧美精品黄色| 精品在线播放| 久久免费大视频| 伊人久久视频| 欧美男人天堂| а√天堂8资源在线| 精品精品99| 国产成人精品亚洲线观看| 麻豆国产一区| 老司机精品视频在线播放| 国产欧美日韩影院| 69精品国产久热在线观看| 少妇精品久久久| 久久av一区二区三区| 午夜久久美女| 精品在线91| 夜久久久久久| 亚洲一区免费| 国产精品婷婷| 老色鬼久久亚洲一区二区| 国产亚洲激情| 亚洲一区日本| 亚洲精品乱码| 日韩精品欧美精品| 欧美天堂在线| 欧美成a人片免费观看久久五月天| 久久国产精品色av免费看| 日本午夜精品视频在线观看| 综合视频一区| 日韩专区视频网站| 欧美色综合网| 国产精品久久久免费| 国产精品99久久免费观看| 麻豆成人在线观看| 国产成人免费精品| 久久精品在线| 在线亚洲成人| 亚洲欧洲av| 青青草精品视频| 欧美精品不卡| 天堂网av成人| 久久国产88| 91午夜精品| 韩国一区二区三区视频| 国产精品蜜芽在线观看| 欧美日韩中文字幕一区二区三区| 亚洲免费播放| 91国内精品| 精品国产欧美| 久久久久久久久久久9不雅视频| 国产综合婷婷| 亚洲精品欧美| 久久gogo国模啪啪裸体| 日韩精品电影| 日韩一级精品| 国产精品一国产精品k频道56| 97精品国产福利一区二区三区| 99成人在线视频| 免费高清在线一区| 97久久亚洲| av综合电影网站| 亚洲一区二区成人| 久久精品99国产国产精| 中文字幕在线高清| 首页欧美精品中文字幕| 国产毛片久久久| 成人精品天堂一区二区三区| 久久成人一区| 久久久国产精品网站| 国产字幕视频一区二区| 欧美性www| 久久久成人网| 日韩二区在线观看| 成人精品中文字幕| 视频一区欧美日韩| 国产一区二区三区四区五区| 欧美日韩精品免费观看视频完整| 欧美日韩中出| 99精品综合| 久久国产免费看| 精品在线91| 午夜电影一区| 日本免费一区二区三区四区| 亚洲欧洲免费| 国产精品99在线观看| 亚洲深夜影院| 美女视频黄免费的久久| 亚洲一区二区网站| 国产91在线精品| 99视频精品免费观看| 国产经典一区| 久久性天堂网| 国产伦久视频在线观看| 日本一区福利在线| 久久精品高清| 久久久久伊人| 亚洲久久一区| 日韩在线观看不卡| 久久不见久久见免费视频7| 久久不射中文字幕| 免费高潮视频95在线观看网站|