精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

談談MVVM和鏈式網絡請求架構

移動開發 iOS
MVVM其實是MVC的進化版,它將業務邏輯從VC中解耦到ViewModel,來實現VC大’瘦身’。

前言

前一段時間一直在學習iOS的架構。為什么呢?

公司的架構一直是MVC,當我們正式上線的時候,項目已經有了超十萬行代碼。主要的VC一般都有2000行代碼以上。

關鍵是,目前版本我們只做了三分之一的業務邏輯…

所以,架構重構吧。

正文

MVVM

MVVM: Model-View-ViewModel

MVVM其實是MVC的進化版,它將業務邏輯從VC中解耦到ViewModel,來實現VC大’瘦身’。

用代碼解釋吧!

做一個簡單的登錄判斷:

創建LoginViewModel(邏輯處理),LoginModel(只放數據),LoginViewController。

這里不用LoginView是為了讓初學者能更好的把精力集中在用ViewModel解耦上。

當然要是你這些都明白,你可以直接看Wzxhaha/RandomerFramework,這是我在做的獨立項目Randomer的基本架構(SubClasses+Protocol+MVVM+RAC)以及它的登錄注冊模塊。另外,感謝王隆帥的這篇文章為我打開了新世界的大門。

在LoginModel中加入方法

  1. //.h 
  2.  
  3. - (instancetype)initWithUserName:(NSString *)username password:(NSString *)password
  4.  
  5.   
  6.  
  7. @property (nonatomic,copy,readonly)NSString * username; 
  8.  
  9. @property (nonatomic,copy,readonly)NSString * password
  10.  
  11.  
  12. //.m 
  13.  
  14. - (instancetype)initWithUserName:(NSString *)username password:(NSString *)password { 
  15.  
  16.     if (self = [super init]) { 
  17.  
  18.         _username = username; 
  19.  
  20.         _password = password
  21.  
  22.     } 
  23.  
  24.     return self; 
  25.  
  26.  

這個沒什么好講的,就是給Model加一個初始化方法。

在LoginViewModel中加入方法

  1. #import "PersonModel.h" 
  2.  
  3.   
  4.  
  5. - (instancetype)initWithPerson:(PersonModel *)person; 
  6.  
  7. @property (nonatomic,assign,readonly)BOOL canLogin; 
  8.  
  9.  
  10. - (instancetype)initWithPerson:(PersonModel *)person { 
  11.  
  12.     if (self = [super init]) { 
  13.  
  14.      //在這做你綁定model后的處理 
  15.  
  16.       _canLogin = [self valiCanLoginWithUserName:person.username password:person.password]; 
  17.  
  18.     } 
  19.  
  20.     return self; 
  21.  
  22.  
  23.   
  24.  
  25. - (BOOL)valiCanLoginWithUserName:(NSString *)username password:(NSString *)password { 
  26.  
  27.     if (username.length & password.length) { 
  28.  
  29.         return YES; 
  30.  
  31.     } else { 
  32.  
  33.         return NO
  34.  
  35.     } 
  36.  
  37.  

給ViewModel添加個綁定Model的初始化方法,以及判斷帳號密碼是否有效的方法。

然后VC(或者View)就可以直接這樣獲得判斷后的結果

  1. PersonModel * person = [[PersonModel alloc]initWithUserName:@"10" password:@"10"]; 
  2.  
  3. PersonViewModel * viewModel = [[PersonViewModel alloc]initWithPerson:person]; 
  4.  
  5.   
  6.  
  7. NSLog(@"%d",viewModel.canLogin);  

簡單的功能的時候沒什么,當你處理復雜的邏輯判斷的時候,MVVM會有巨大優勢。

順便講一下ReactiveCocoa,我之所以這么推崇MVVM,主要就是因為RAC和MVVM簡直太配了!

ReactiveCocoa

RAC具有函數式編程和響應式編程的特性,要是對編程思想不熟的可以看我的WZXProgrammingIdeas

RAC***的用處就是能監聽到各個事件,RAC把這個叫做信號流,然后接受信號通過block回調,里面大量的使用了block,所以一定要用好@weakify(self)和@strongify(self)。

為什么說RAC和MVVM太配了?

MVVM是把方法解耦到ViewModel,但是還是要VC(V)調用的,那么判斷什么時候調用的邏輯還是會復雜。

而RAC解決了這個問題,它負責監聽事件,然后調用ViewModel來進行邏輯判斷。

例如:

  1. [[_registerBtn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) { 
  2.  
  3.       @strongify(self) 
  4.  
  5.       [self.viewModel toRegisterWithType:Register]; 
  6.  
  7.   }]; 
  8.  
  9.  
  10.  
  11.   [[_loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) { 
  12.  
  13.       @strongify(self) 
  14.  
  15.       [self.viewModel loginWithUserName:self.usernameTextField.text password:self.usernameTextField.text Success:^(idresponse) { 
  16.  
  17.       } failure:^{ 
  18.  
  19.           SHOW_ERROR(@"錯誤", @"賬號或密碼錯誤"
  20.  
  21.       } error:^(NSError *error) { 
  22.  
  23.           SHOW_ERROR(@"錯誤", @"網絡連接失敗"
  24.  
  25.       }]; 
  26.  
  27.   }];  

RAC監聽了登錄和注冊按鈕,使得代碼簡潔,而且結構十分緊湊。

Demo的話還是看這個吧Wzxhaha/RandomerFramework

https://github.com/Wzxhaha/RandomerFramework

或者簡單版的WZXRACDemo

https://github.com/Wzxhaha/WZXRACDemo

鏈式網絡請求框架

為什么封裝WZXNetworking

這是一個容錯性非常嚇人的框架。

  1. [[WZXNetworkManagermanager].setRequest(@"http://192.168.1.40:8001").RequestType(POST).HTTPHeader(nil).Parameters(nil).RequestSerialize(RequestSerializerHTTP).ResponseSerialize(ResponseSerializerJSON) startRequestWithSuccess:^(id response) { 
  2.  
  3.   
  4.  
  5.         NSLog(@"success"); 
  6.  
  7.     } failure:^{ 
  8.  
  9.   
  10.  
  11.         NSLog(@"failure"); 
  12.  
  13.     }]; 

在這里除了.setRequest(url)和startRequestWithSuccess failure方法,其他都是非必要的。

你可以這樣:

  1. [[WZXNetworkManager manager].setRequest(@"http://192.168.1.40:8001") startRequestWithSuccess:^(id response) { 
  2.  
  3.   
  4.  
  5.         NSLog(@"success"); 
  6.  
  7.     } failure:^{ 
  8.  
  9.   
  10.  
  11.         NSLog(@"failure"); 
  12.  
  13.     }];  

鏈式在參數和參數的選擇很多的情況或者很有可能改動的情況下展現了驚人的優勢。因為,它的改動十分方便,只不過添加或者修改一個方法。

打個比方:

換成集中式API封裝應該是這樣的:

  1. - (void)GET:(NSString *)url 
  2.  
  3.         parameters:(id)Parameters 
  4.  
  5.         success:(SuccessBlock)success 
  6.  
  7.         failure:(FailureBlock)failure; 

當你要添加一個Version屬性做API版本判斷的時候,你能怎么辦?只能重寫方法,在方法中加入一個Version參數,然后所有使用的網絡請求都要改變方法。

換成分布式API封裝我們則不考慮對比了..

  1. GeneralAPI *apiGeGet            = [[GeneralAPI alloc] initWithRequestMethod:@"get"]; 
  2.  
  3. apiGeGet.apiRequestMethodType      = RequestMethodTypeGET; 
  4.  
  5. apiGeGet.apiRequestSerializerType  = RequestSerializerTypeHTTP; 
  6.  
  7. apiGeGet.apiResponseSerializerType = ResponseSerializerTypeHTTP; 
  8.  
  9. [apiGeGet setApiCompletionHandler:^(id responseObject, NSError * error) { 
  10.  
  11.     NSLog(@"responseObject is %@", responseObject); 
  12.  
  13.     if (error) { 
  14.  
  15.         NSLog(@"Error is %@", error.localizedDescription); 
  16.  
  17.     } 
  18.  
  19. }]; 
  20.  
  21. [apiGeGet start];  

這樣的結構是否太松散?

再換成WZXNetworking

我們要做的只是再添加一個方法和一個成員變量,然后在原有方法后面加一個.method()

  1. - (WZXNetworkManager * (^) (id some))method { 
  2.  
  3.   return ^WZXNetworkManager (id some) { 
  4.  
  5.      self.XXX = some 
  6.  
  7.      return self; 
  8.  
  9.   } 
  10.  
  11.  
  1. [[WZXNetworkManager manager].setRequest(@"http://192.168.1.40:8001").method(some) startRequestWithSuccess:^(idresponse) { 
  2.  
  3.   
  4.  
  5.         NSLog(@"success"); 
  6.  
  7.     } failure:^{ 
  8.  
  9.   
  10.  
  11.         NSLog(@"failure"); 
  12.  
  13.     }];  

代碼放這:WZXNetworking

https://github.com/Wzxhaha/WZXNetworking

至于鏈式是怎么實現的,還是看那個WZXProgrammingIdeas

https://github.com/Wzxhaha/WZXProgrammingIdeas

責任編輯:龐桂玉 來源: iOS大全
相關推薦

2019-11-27 11:10:58

TomcatOverviewAcceptor

2024-05-07 08:07:30

云原生

2024-04-28 10:22:08

.NETMVVM應用工具包

2017-07-17 15:19:10

MVVM模式iOS開發MVP

2013-01-04 10:03:32

AjaxASP.NET

2022-03-02 15:31:32

架構網絡請求代碼

2023-01-05 11:27:27

技術架構

2017-04-14 15:42:14

2022-11-16 14:18:03

數據湖數據倉庫數據架構

2021-12-27 08:04:49

架構網站高并發

2023-05-16 08:01:13

架構網站演進

2013-06-20 10:28:39

MVVM框架avalon架構

2013-12-11 17:10:53

2017-11-09 10:28:45

軟件定義網絡

2017-02-27 09:36:01

AndroidMVVM架構

2012-04-16 15:08:33

2016-07-01 16:13:13

AWSLambda

2017-07-20 11:18:22

Vue.jsMVVMMVC

2021-01-12 08:20:51

AndroidActivity系統

2022-12-08 16:02:39

數據架構工具
點贊
收藏

51CTO技術棧公眾號

欧美一级二级三级区| 久久久久久久久久成人| 激情视频极品美女日韩| 日本久久电影网| 成人免费看片视频在线观看| 三级小视频在线观看| 美女脱光内衣内裤视频久久影院| 欧美福利视频网站| 欧美一区二区三区粗大| 99精品中文字幕在线不卡| 色天天综合久久久久综合片| 一二三在线视频| 国产黄在线看| 99在线精品一区二区三区| 国产精品一区二区三区成人| 日本少妇毛茸茸高潮| 91久久久精品国产| 国产一区二区精品丝袜| 免费黄色三级网站| 试看120秒一区二区三区| 一本大道久久a久久精二百| 日韩免费在线观看av| www在线播放| 久久久亚洲欧洲日产国码αv| 成人看片在线| 国产免费黄色大片| 日本中文字幕一区二区有限公司| 久久久久久国产精品久久| 懂色av粉嫩av蜜臀av一区二区三区| 日韩在线麻豆| 亚洲国产高潮在线观看| aaaaaaaa毛片| 国产亚洲字幕| 欧美日韩午夜在线| wwww.国产| 日本一道高清亚洲日美韩| 黑人巨大精品欧美一区二区三区| 精品国产av无码一区二区三区| 菠萝蜜视频国产在线播放| 国产精品久久久久aaaa| 午夜精品区一区二区三 | 亚洲女同性videos| 一级特黄a大片免费| 精品国产一区二区三区不卡蜜臂| 91精品国产综合久久久久久久| 色国产在线视频| 日本综合视频| 欧美自拍丝袜亚洲| 亚洲精品视频导航| 国产精成人品2018| 欧美色综合久久| 日韩肉感妇bbwbbwbbw| 99精品在免费线偷拍| 欧美吞精做爰啪啪高潮| 亚洲福利精品视频| 欧美日韩视频免费看| 欧美日本不卡视频| 污污视频网站在线| 日韩一区免费| 亚洲成色777777在线观看影院 | 中文字幕欧美区| 日韩性感在线| 免费在线午夜视频| 亚洲精品一卡二卡| 日韩欧美精品免费| 绿色成人影院| 欧美性色黄大片| 在线观看国产一级片| 榴莲视频成人app| 亚洲精品在线网站| 波多野结衣一本| 久久综合99| 久久久免费精品视频| 中文字幕av影院| 精品一区二区在线免费观看| 国产精品初高中精品久久| 免费观看精品视频| 欧美特黄一级片| 中文字幕日韩欧美精品高清在线| 欧美风情在线观看| 性色av免费观看| 老司机精品视频在线| 亚洲精品免费一区二区三区| 蜜桃av中文字幕| 久久精品网站免费观看| 精品国产一区二区三区在线| caoporn视频在线观看| 日本韩国精品一区二区在线观看| 思思久久精品视频| 第四色中文综合网| 伊人激情综合网| 免费人成在线观看| 老司机免费视频久久| 69174成人网| 亚洲欧洲综合在线| 亚洲人精品午夜| 五月婷婷另类国产| 亚洲欧美在线网| 98色花堂精品视频在线观看| 欧美三级中文字幕在线观看| 成人午夜精品无码区| 欧美色网址大全| 97在线视频免费看| 91亚洲国产成人精品一区| 99久久久精品| dy888午夜| 日本黄色一区| 亚洲精品久久久久久久久久久| 神马久久精品综合| 水蜜桃久久夜色精品一区的特点| www.久久艹| 日本高清中文字幕在线| 色综合久久久久久久久| xxxx视频在线观看| 欧美在线1区| 国产精品亚洲美女av网站| 欧美日韩在线中文字幕| 亚洲成a人v欧美综合天堂 | 成人在线免费看视频| 国产乱人伦精品一区二区在线观看| 欧美日韩精品综合| heyzo一区| 日韩精品一区二区在线观看| 国产农村妇女精品一区| 久热综合在线亚洲精品| 精品无人乱码一区二区三区的优势 | 久久精品网站免费观看| 凹凸国产熟女精品视频| 国内毛片久久| 久久久久久久久久久成人| av中文字幕第一页| 亚洲色图20p| 五月天婷婷影视| 亚洲91精品| 成人黄色免费片| 日韩三级影院| 精品视频1区2区3区| 一二三四在线观看视频| 肉丝袜脚交视频一区二区| 欧美精品二区三区四区免费看视频 | 亚洲黄色av片| 婷婷伊人综合| 91久久中文字幕| 新版中文在线官网| 日韩女优制服丝袜电影| 国产乡下妇女做爰| jiyouzz国产精品久久| 国产二区视频在线| 国产精品zjzjzj在线观看| 韩国福利视频一区| 日韩三级电影网| 在线亚洲一区观看| 免费看黄色av| 久久91精品久久久久久秒播| 一级全黄肉体裸体全过程| 欧美激情三级| 91国产高清在线| 国产在线一二| 欧美日韩一区成人| 一区视频免费观看 | 国产精品无码久久久久一区二区| 午夜亚洲一区| 亚洲蜜桃在线| 视频一区视频二区欧美| 2019中文字幕在线观看| 黄色毛片在线观看| 欧美浪妇xxxx高跟鞋交| 精品少妇久久久| 久久久亚洲国产美女国产盗摄| 中文字幕第36页| 午夜欧美精品| 久久久久久99| 色999韩欧美国产综合俺来也| 蜜月aⅴ免费一区二区三区| 欧美一区二区三区黄片| 在线视频观看一区| 亚洲熟女www一区二区三区| proumb性欧美在线观看| 在线黄色免费观看| 在线精品在线| 先锋影音一区二区三区| 欧美日本三级| 国产精品老牛影院在线观看| 亚洲丝袜一区| 一区二区三区亚洲| 亚洲免费视频网| 欧美在线短视频| 欧美久久久久久久久久久久| 久久久精品一品道一区| 中文字幕55页| 日韩激情视频在线观看| 欧妇女乱妇女乱视频| 日韩av自拍| 国产一区二区三区高清| 久久爱.com| 青青草原一区二区| 伊人影院在线视频| 亚洲小视频在线观看| 好吊色一区二区三区| 欧美久久久久免费| 亚洲日本韩国在线| 一区二区三区免费| 在线观看免费小视频| 99久久综合99久久综合网站| 亚洲精品mv在线观看| 肉肉av福利一精品导航| 青青青免费在线| 综合久久婷婷| 一区二区三区四区国产| 国产欧美一区| 精品国产一区二区三区四区精华| 国产精品亚洲欧美一级在线| 国产精品老女人视频| 蜜桃视频www网站在线观看| 美女福利精品视频| 瑟瑟视频在线| 一个色综合导航| 免费一级在线观看播放网址| 亚洲国产一区自拍| 国产综合视频在线| 日韩一区二区三区高清免费看看| 亚洲天堂视频在线| 欧美色图一区二区三区| 69视频免费看| 欧亚洲嫩模精品一区三区| 麻豆精品久久久久久久99蜜桃| 亚洲va国产天堂va久久en| 五月婷婷一区二区| 亚洲精品成人天堂一二三| 中文字幕电影av| 亚洲天堂福利av| 国产高潮流白浆| 亚洲三级电影网站| 日本福利片在线观看| 最新不卡av在线| 欧美激情精品久久久久久免费| 中文字幕亚洲区| 国产精品免费人成网站酒店| 亚洲美女偷拍久久| 欧美成欧美va| 亚洲国产综合91精品麻豆 | 欧美日韩在线播| 伊人久久一区二区| 欧美日韩一卡二卡| 国产精品欧美综合亚洲| 5858s免费视频成人| 国产精品伊人久久| 日韩欧美在线不卡| 成人毛片视频免费看| 亚洲精品一区二区在线观看| 欧美综合视频在线| 亚洲毛片在线看| 番号集在线观看| 色婷婷av一区二区三区在线观看| 欧美猛烈性xbxbxbxb| 久久视频免费在线播放| 欧洲精品二区| 日韩av电影在线网| 91成人在线| 91嫩草视频在线观看| 狠狠一区二区三区| 日本一区免费| 五月婷婷亚洲| 波多野结衣综合网| 视频一区视频二区在线观看| 超碰人人草人人| 成人av午夜电影| caopeng视频| 最新日韩av在线| 亚洲一区 视频| 日本道色综合久久| 国产特级黄色片| 日韩精品在线观看网站| 69久久精品| 久久久久久久久久婷婷| 搜成人激情视频| 亚洲一区二区免费在线| 希岛爱理av免费一区二区| 亚洲国产综合自拍| 亚洲二区在线| 亚洲36d大奶网| aaa国产一区| 欧美性生交大片| 亚洲一区二区三区四区在线 | 日韩精品一区在线观看| 毛片免费在线观看| 九九热精品视频国产| 伊人久久av| 亚洲最大的网站| 国产一区二区三区四区五区 | 蜜臀av一区二区三区| 久久久久国产免费| 国产精品区一区二区三| 四虎永久在线精品| 91精品国产一区二区人妖| 三级视频网站在线| 欧美风情在线观看| 外国成人毛片| 视频在线精品一区| 亚洲三级观看| 国产成人av免费观看| 国产亚洲欧美色| 西西44rtwww国产精品| 欧美一区二区久久| 91精彩在线视频| 秋霞成人午夜鲁丝一区二区三区| 999国产精品一区| 一区二区不卡在线观看| 久久久综合网| 亚洲一区二区在线免费| 亚洲免费av高清| 自拍偷拍色综合| 亚洲免费视频观看| 精品极品在线| 国产高清一区二区三区| 亚洲情侣在线| 国产精品嫩草影院8vv8| 国产欧美久久久精品影院| 久久精品视频1| 亚洲国模精品私拍| 国产羞羞视频在线播放| 666精品在线| 一区二区三区网站| 中文字幕线观看| 国产精品传媒视频| 中文字幕人妻丝袜乱一区三区| 亚洲欧美日韩在线高清直播| 色戒汤唯在线| 久久精品国产精品国产精品污| 影音先锋久久| 国产精品一区二区在线免费观看| 一区二区三区四区不卡视频 | 亚洲欧美自拍一区| 97se综合| 欧美在线播放一区| 三级欧美在线一区| 蜜桃av免费看| 在线一区二区三区| 国产高清自拍视频在线观看| 国产精品成人播放| 日韩视频在线观看| 国产女同无遮挡互慰高潮91| 亚洲天堂中文字幕| 国产xxxx孕妇| 久久免费国产视频| 欧美一级全黄| 亚洲黄色a v| 国产精品视频在线看| 97精品人妻一区二区三区| 久热精品视频在线免费观看| 日韩欧美中文字幕一区二区三区| 亚洲精品久久久久久久蜜桃臀| 99精品国产视频| 亚洲精品中文字幕乱码三区91| 国产亚洲精品激情久久| 四虎影视国产精品| 国产精品igao激情视频| 99久久99久久精品国产片果冻| 日本天堂网在线| 日韩综合视频在线观看| 久久的色偷偷| 日韩中文字幕在线视频观看| 国产三级久久久| 国产片在线播放| 97久久久久久| 欧美另类69xxxxx| 91网址在线观看精品| 亚洲成a人v欧美综合天堂| 欧洲免费在线视频| 国产欧美精品在线| 黄色成人精品网站| 添女人荫蒂视频| 欧美精品 日韩| 草草视频在线观看| 视频一区二区在线观看| 国产高清在线观看免费不卡| 91九色丨porny丨肉丝| 最近2019年手机中文字幕| aiai久久| 午夜精品中文字幕| 亚洲高清不卡在线观看| av在线电影免费观看| 岛国视频一区免费观看| 狂野欧美一区| 久艹视频在线观看| 在线一区二区日韩| 麻豆精品99| 一级黄色片在线免费观看| 午夜成人免费视频| 麻豆最新免费在线视频| 蜜桃av色综合| 国产精品66部| 欧美 亚洲 另类 激情 另类| 欧美高清激情视频| 成人精品视频| 成人手机在线免费视频| 这里只有精品免费| 88xx成人免费观看视频库| 国产精品www在线观看| 亚洲人成网站色在线观看|