成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

iOS中的MVP模式初探

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

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

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

iOS中的MVP模式初探

MVC模式示意圖

模型拿到數(shù)據(jù), 可能是數(shù)據(jù)庫或者網(wǎng)絡(luò)數(shù)據(jù)

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

將數(shù)據(jù)傳遞給控制器, 控制器經(jīng)過簡單地加工

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

將加工后的數(shù)據(jù)展示出來

cell展示模型中的數(shù)據(jù)

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

iOS中的MVP模式初探

MVP模式示意圖

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

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

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

關(guān)于C端和P端的循環(huán)引用的問題, 直接用weak關(guān)鍵字就可以解決了

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

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

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

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

另外, P層還可以展示數(shù)據(jù), 直接展示數(shù)據(jù), present方法, 利用模型展示數(shù)據(jù), 利用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; // 自適應(yīng)高度 _view.rowHeight = UITableViewAutomaticDimension; _view.estimatedRowHeight = 100; return self;}- (void)setView:(UITableView *)view{ // 設(shè)置視圖 _view = view; _view.delegate = self; _view.dataSource = self; _view.separatorStyle = UITableViewCellSeparatorStyleNone; // 自適應(yīng)高度 _view.rowHeight = UITableViewAutomaticDimension; _view.estimatedRowHeight = 100;}

比如上面的代碼, 將tableView的數(shù)據(jù)源和代理都給了P, 那么P就相當于行使了控制器的權(quán)力, 當P層拿到數(shù)據(jù)時(沒錯, 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 要處理好數(shù)據(jù)的顯示格式 self.hpModel = [[CellSelfSizeModel alloc] initWithDic:dataDic]; // 刷新 [self present]; }

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

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

然后重走tableView的數(shù)據(jù)源方法. 將數(shù)據(jù)分發(fā)給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;}

這樣就實現(xiàn)了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; // 外邊是要傳入?yún)⑦M去的 -- 數(shù)據(jù)模型 [self.hpPresenter loadHPData]; }

只需要初始化P層, 然后調(diào)P層的接口就可以了. 至于P層內(nèi)部的邏輯, 我不需要知道

V層也只專注于視圖的創(chuàng)建

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

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

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

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

標簽: IOS
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产一区欧美日韩| 精品三级av在线| 欧美一区二区三区系列电影| 日本欧洲一区二区| 亚洲福利电影| 宅男噜噜噜66一区二区66| 婷婷亚洲久悠悠色悠在线播放| 亚洲欧洲一区二区在线观看| 国产日韩影视精品| 91视频xxxx| 久久久久久久久岛国免费| 国产高清久久久| 日韩三级在线免费观看| 风间由美中文字幕在线看视频国产欧美 | 欧美日韩大片一区二区三区| 精品国产伦一区二区三区免费| 国产精品一区二区久久精品爱涩 | 亚洲男人都懂的| 一本久道久久久| 一区二区三区产品免费精品久久75| 亚洲欧洲精品一区二区| 亚洲色欲色欲www| 国产日韩欧美三级| 亚洲成人自拍偷拍| 91精彩视频在线| 国内精品免费**视频| 精品视频在线免费观看| 国产精品一品视频| 日韩欧美国产精品| 99精品欧美一区二区蜜桃免费| 久久新电视剧免费观看| 欧美成人亚洲| 亚洲欧美在线视频观看| 一本久道久久综合婷婷鲸鱼| 午夜日韩在线电影| 欧美婷婷六月丁香综合色| 韩国午夜理伦三级不卡影院| 欧美电影精品一区二区| 色综合久久中文字幕综合网| ...中文天堂在线一区| 一区二区三区国产盗摄 | 你懂的成人av| 1000部国产精品成人观看| 在线视频免费在线观看一区二区| 亚洲精品视频免费观看| 日本电影欧美片| 日韩精品三区四区| 宅男噜噜噜66一区二区66| av高清不卡在线| 中文字幕字幕中文在线中不卡视频| 国产农村妇女毛片精品久久莱园子| 蜜臀av性久久久久蜜臀aⅴ| 777欧美精品| 欧美一区成人| 一区二区三区四区蜜桃| 一本大道久久精品懂色aⅴ| 狠狠色综合播放一区二区| 日韩精品一区二区三区视频在线观看| 91视视频在线观看入口直接观看www | 亚洲视频在线观看一区| 久久精品男女| 久久国产人妖系列| 日韩欧美在线不卡| 精品91在线| 蜜桃av一区二区| 精品国产乱码久久久久久久久 | 在线不卡的av| 99久久婷婷国产| 亚洲人xxxx| 日本电影亚洲天堂一区| av一区二区三区| 一区二区三区在线观看欧美| 欧美亚洲图片小说| 99久久99久久精品国产片果冻| 亚洲精品伦理在线| 欧美日韩一区二区三区视频| 91麻豆免费观看| 视频在线在亚洲| 欧美刺激脚交jootjob| 一区二区激情| 国产+成+人+亚洲欧洲自线| 最近中文字幕一区二区三区| 欧美吞精做爰啪啪高潮| 国产高清在线精品| 亚洲日韩欧美一区二区在线| 欧洲一区二区av| 欧美日韩免费高清| 麻豆精品视频在线观看| 国产精品三级av| 欧美酷刑日本凌虐凌虐| 欧美亚洲不卡| 精品影视av免费| 亚洲欧美日韩成人高清在线一区| 欧美日韩一区在线| 亚洲午夜电影| 国产乱妇无码大片在线观看| 亚洲美女淫视频| 精品少妇一区二区三区日产乱码 | 欧美精品在线观看播放| 国内视频一区| 久久9热精品视频| 亚洲欧洲一区二区三区| 9191久久久久久久久久久| 亚洲精品日韩精品| www.在线欧美| 奇米精品一区二区三区四区| 中文字幕中文字幕中文字幕亚洲无线| 欧美三级电影在线看| 亚洲视频综合| 国产成人精品影院| 视频在线在亚洲| 亚洲同性gay激情无套| 欧美成人女星排行榜| 久久综合九九| 一区在线视频观看| 成人精品一区二区三区四区| 亚洲成人高清在线| 国产精品网站导航| 欧美大度的电影原声| 色屁屁一区二区| 日韩图片一区| 牛人盗摄一区二区三区视频| 国产做a爰片久久毛片| 亚洲成在人线在线播放| 国产精品久久久久久久裸模| 欧美一级在线视频| 在线观看一区二区视频| 国产精品入口| 国内精品久久久久久久果冻传媒| 丁香婷婷综合网| 日本不卡视频一二三区| 久久综合色婷婷| 欧美精品在线一区二区三区| 久久久久久穴| 夜夜爽av福利精品导航| 农村妇女精品| 成人爱爱电影网址| 国产乱子伦视频一区二区三区| 偷拍一区二区三区四区| 亚洲婷婷在线视频| 国产蜜臀97一区二区三区| 91精品国产色综合久久不卡蜜臀 | 一区二区三区四区国产精品| 国产日韩精品一区二区三区在线| 日韩一区二区电影网| 欧美日韩一区高清| 久久精品免费| 亚洲综合欧美| 在线日韩视频| 狠狠色噜噜狠狠色综合久| 欧美精品日本| 91香蕉视频在线| 成人黄页毛片网站| 国产成人精品亚洲777人妖| 精品综合免费视频观看| 美女任你摸久久| 日韩av中文字幕一区二区 | 久久久噜噜噜久噜久久综合| 91精品婷婷国产综合久久性色| 欧洲一区在线电影| 色婷婷狠狠综合| 色猫猫国产区一区二在线视频| 久久久久久久尹人综合网亚洲| 亚洲欧美国产不卡| 午夜亚洲性色福利视频| 一本一本久久| 中文高清一区| 国产精品久久一区二区三区| 一区二区免费在线视频| 亚洲国产成人不卡| 亚洲高清资源| av不卡在线看| 一区二区精品在线| 亚洲一区二区成人| 久久精品系列| 欧美在线小视频| 欧美精品精品一区| 欧美一区二区三区免费观看视频| 日韩一区二区三区视频| 日韩欧美久久一区| 久久久91精品国产一区二区精品| 91精品国产综合久久精品| 日韩三级在线免费观看| 欧美变态口味重另类| 久久免费视频一区| 国产人妖乱国产精品人妖| 国产精品人妖ts系列视频| 亚洲私人黄色宅男| 亚洲影院在线观看| 天天射综合影视| 精品一区二区影视| 国产91在线观看丝袜| 91蜜桃传媒精品久久久一区二区| 欧美不卡在线| 亚洲精品久久| 久久伊人亚洲| 3751色影院一区二区三区| 精品国产一区二区精华| 国产精品久久一级| 亚洲一二三区不卡|