精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

三级久久三级久久久| 乱中年女人伦av一区二区| 亚洲欧美综合另类在线卡通| 欧美美女一区二区三区| 人人妻人人澡人人爽精品欧美一区| 国产又粗又黄又爽| 国产亚洲在线| 最近2019好看的中文字幕免费| 香蕉视频色在线观看| 国产在线观看www| 成人区精品一区二区| 欧美日本韩国国产| 中文字幕一区二区久久人妻| 欧美福利一区| 亚洲少妇激情视频| 久草免费资源站| 精品肉辣文txt下载| 亚洲一级二级三级| 日韩欧美一区二区视频在线播放| www.好吊色| 日韩成人一级大片| 亚洲3p在线观看| 三级全黄做爰视频| av在线日韩| 97精品久久久午夜一区二区三区 | 91久久久免费一区二区| 成人性做爰片免费视频| 亚洲网站免费观看| 亚洲综合日韩| 久久久久久国产| 情侣偷拍对白清晰饥渴难耐| 欧美伦理影院| 亚洲免费一级电影| 少妇激情一区二区三区视频| 久久在线观看| 欧美区视频在线观看| 日本精品久久久久中文字幕| 久青青在线观看视频国产| 国产成人丝袜美腿| 91色中文字幕| 国产精品久久综合青草亚洲AV| 老牛嫩草一区二区三区日本 | 日日av拍夜夜添久久免费| 亚洲国产精品一区二区久久| 一二三四中文字幕| av激情在线| 亚洲精品福利视频网站| 综合久久国产| 精品黑人一区二区三区在线观看| 青青草原综合久久大伊人精品优势| 日本久久中文字幕| 免费看毛片网站| 国产精品五区| 欧美壮男野外gaytube| 国产视频91在线| 亚洲茄子视频| 91精品国产91| 成人午夜淫片100集| 亚洲欧美视频| 国产99久久精品一区二区| 国产精品久久久久久人| 日韩在线a电影| 国产精品人成电影| 精品人妻在线播放| 极品日韩av| 91chinesevideo永久地址| 国产又黄又猛又粗又爽| 久久先锋影音| 国产精品视频午夜| 国产喷水福利在线视频| 粉嫩一区二区三区在线看| 国产精品一 二 三| 在线播放精品视频| 国产在线不卡一卡二卡三卡四卡| 91精品国产91久久久久久| 亚洲久久在线观看| 亚洲成人精选| 欧美国产精品人人做人人爱| 91浏览器在线观看| 老司机免费视频久久| 国产精品久久久久久久久免费 | 黄色一级片在线| 亚洲高清毛片| 国产成人97精品免费看片| 在线观看国产黄| 国产精品亚洲第一| 久久国产精品久久精品国产| 福利在线午夜| 亚洲综合区在线| 亚洲爆乳无码专区| 欧美成人毛片| 亚洲成人久久一区| 在线观看免费小视频| 欧美日韩亚洲国产精品| 在线观看日韩视频| 黄色a级片在线观看| 欧美日韩中文一区二区| 欧美另类xxx| 精品人妻无码一区二区性色| 久久电影网站中文字幕| 成人综合一区| 日韩精品在线免费| 精品人体无码一区二区三区| 欧美日韩国产高清| 国产精品久久久久av免费| 精品人妻一区二区三区麻豆91| 9人人澡人人爽人人精品| 亚洲人一区二区| √8天堂资源地址中文在线| 欧美性生活影院| 一边摸一边做爽的视频17国产| 国产影视精品一区二区三区| 欧美第一黄网免费网站| 欧美日韩 一区二区三区| 丁香六月久久综合狠狠色| 国产精品专区h在线观看| 亚洲风情第一页| 国产精品18久久久久久久久 | 亚洲国产综合一区| 国产午夜精品理论片a级大结局| 国产1区2区3区中文字幕| 电影亚洲一区| 亚洲欧美日韩网| 国产一级aa大片毛片| 狠狠v欧美v日韩v亚洲ⅴ| 国产成人综合av| 亚洲黄色在线观看视频| 中文字幕免费一区| 亚洲日本理论电影| 一区二区精品伦理...| 日韩午夜激情视频| 99久久久无码国产精品不卡| 久久久777| 久久大片网站| 黄色aa久久| 精品国产91洋老外米糕| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 亚洲成人tv网| 国产成人精品一区二区在线小狼| 91久久国产| 国产欧美日韩视频| 91精品国产91久久久久游泳池 | 91欧美日韩麻豆精品| 日本一区二区三级电影在线观看| 精品久久久久av| 香蕉视频一区| 欧美综合第一页| 无码精品黑人一区二区三区| 午夜成人免费电影| 少妇一级淫片免费放播放| 在线播放精品| 久久66热这里只有精品| 永久免费毛片在线播放| 日韩精品久久久久久久玫瑰园| 国产一级做a爱片久久毛片a| 91网上在线视频| 欧美 国产 综合| 日韩高清不卡| 国产一区av在线| 中文字幕二区三区| 成人欧美一区二区三区黑人麻豆| 不卡中文字幕在线观看| 亚洲第一天堂| 岛国视频一区免费观看| 97人人在线视频| 日韩精品视频三区| 中文字幕av在线免费观看| 一区在线播放视频| 第一页在线视频| 亚洲第一黄色| 欧美性天天影院| 久久爱.com| 久99久在线视频| 天天色综合久久| 91电影在线观看| 欧美第一页在线观看| 成人性色生活片免费看爆迷你毛片| 9久久9毛片又大又硬又粗| 国产欧美一区二区三区精品观看 | 91免费视频播放| 亚洲伊人色欲综合网| 污片免费在线观看| 日产国产欧美视频一区精品| 国产又粗又硬又长| 欧美日韩一区二区三区在线电影 | 午夜激情福利在线| 无码一区二区三区视频| 国产欧美一区二区三区不卡高清| 丝袜美腿诱惑一区二区三区| 精品免费一区二区三区| 天天综合天天干| 国产精品乱码久久久久久 | 97久久精品人人做人人爽50路| 欧美精品色婷婷五月综合| 天天色天天射综合网| 狠狠色噜噜狠狠狠狠色吗综合| 91tv亚洲精品香蕉国产一区| 欧美激情中文字幕在线| 国产在线色视频| 欧美成人bangbros| 黄色av一区二区| 亚洲国产视频一区| 大吊一区二区三区| 成人av在线观| 岛国毛片在线播放| 亚洲影视在线| 国产911在线观看| 不卡中文字幕| 精品国产免费久久久久久尖叫 | av中文字幕在线看| 色噜噜亚洲精品中文字幕| 午夜性色福利视频| 欧美区在线观看| 成人一级免费视频| 午夜精品久久久久久不卡8050| 18啪啪污污免费网站| 波多野结衣一区二区三区 | 久久九九影视网| 人妻av一区二区三区| 久久91精品国产91久久小草| 北条麻妃69av| 美女视频免费精品| 亚洲综合成人婷婷小说| 天然素人一区二区视频| 97欧美精品一区二区三区| 午夜激情在线| 精品国内自产拍在线观看| 国产福利免费在线观看| 日韩电影视频免费| 黄色av免费观看| 日韩欧美在线综合网| 国产又粗又猛又黄又爽无遮挡| 在线观看www91| 无码人妻精品一区二区| 粉嫩av一区二区三区免费野| 国产精品99精品无码视| 亚洲综合图片区| 免费一级肉体全黄毛片| 一级精品视频在线观看宜春院| 多男操一女视频| 国产精品高清亚洲| 日韩av片在线免费观看| 国产精品三级在线观看| 人人艹在线视频| 中文字幕+乱码+中文字幕一区| 一色道久久88加勒比一| 久久久国产午夜精品| 亚洲一区视频在线播放| 国产女主播一区| 国产一二三四区在线| 国产精品天天摸av网| 国产又粗又猛又爽又黄的视频小说| 国产精品麻豆欧美日韩ww| 9.1片黄在线观看| 中文字幕亚洲在| 手机av在线看| 亚洲黄色免费电影| 青娱乐av在线| 亚洲成a人v欧美综合天堂| 国产一级精品视频| 91黄视频在线| 国产乱码精品一区二三区蜜臂| 91精品国产品国语在线不卡| 亚洲影院在线播放| 日韩欧美亚洲成人| 日本妇乱大交xxxxx| 欧美男女性生活在线直播观看| 国产乱码久久久| 精品国产一区二区三区四区四 | 在线成人免费| 国产高清一区二区三区| 男人的天堂久久| 日韩高清国产一区在线观看| 999精品色在线播放| 欧美黄网在线观看| 99精品国产99久久久久久福利| 免费日韩视频在线观看| 日韩电影免费在线观看网站| 91小视频在线播放| av亚洲精华国产精华精华| 久久精品国产亚洲av久| 国产精品伦理在线| 国产午夜福利片| 欧美视频一区在线观看| 国产黄色免费大片| 亚洲黄色www| 四虎久久免费| 久久免费福利视频| 91久久久久久白丝白浆欲热蜜臀| 欧美成人性色生活仑片| 涩涩视频网站在线观看| 高清欧美性猛交xxxx| 樱桃视频成人在线观看| 成人福利视频网| 欧美大片网址| 97超碰免费观看| 免费亚洲网站| 中文字幕乱妇无码av在线| 精品一区二区三区免费观看 | 一区二区自拍偷拍| 精品国产亚洲一区二区三区在线观看| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美日本高清一区| 电影一区二区| 久久视频在线观看中文字幕| 91九色精品| 欧美亚洲日本在线观看| 成人精品小蝌蚪| 成年人网站在线观看视频| 精品久久久久久久中文字幕| av加勒比在线| 中文字幕日韩av| 2022成人影院| 国产精品欧美久久| 91精品国产乱码久久久久久| 日韩av在线综合| 97精品久久久久中文字幕| 欧美人妻精品一区二区免费看| 欧美日韩一区二区三区四区| 色久视频在线播放| 高清欧美性猛交xxxx| 日本一区二区乱| 午夜啪啪免费视频| 日本视频在线一区| 性欧美精品中出| 精品久久中文字幕久久av| 欧美在线 | 亚洲| 欧美大片免费观看| 国产精品亚洲欧美一级在线| 夜夜爽99久久国产综合精品女不卡 | 成人免费在线播放视频| 伊人久久久久久久久久久久 | 91免费在线看片| 欧亚洲嫩模精品一区三区| 日韩av成人| 欧美一区第一页| 香蕉成人av| 久久精品欧美| 9国产精品视频| 中国xxxx性xxxx产国| 亚洲一区二区三区自拍| 亚洲av无码国产精品久久不卡 | 欧美日韩电影免费看| 精品一区在线播放| 亚洲免费播放| 无码人妻精品一区二区三应用大全 | 欧美午夜电影网| 在线免费看av| 国产一区二区在线免费| 欧美超碰在线| 天天操精品视频| 亚洲免费观看视频| 精品久久无码中文字幕| 色综合天天综合网国产成人网 | 欧洲成人一区| 亚洲a∨一区二区三区| 中文字幕一区二区三区乱码图片| www.com久久久| 一区二区三区久久| 成人小说亚洲一区二区三区| 午夜欧美不卡精品aaaaa| 日韩最新在线| 国产精品无码av无码| 国产精品天干天干在线综合| 国产又大又长又粗| 欧美疯狂xxxx大交乱88av| 欧美亚视频在线中文字幕免费| 99在线精品免费视频| 久久人人97超碰com| 亚洲视频一区在线播放| 久久午夜a级毛片| 精品国产影院| 国产精品无码专区av在线播放 | 国产无套在线观看| 亚洲精品视频播放| 国产精品天堂蜜av在线播放| 国产一级大片免费看| 99精品偷自拍| 中文字幕一区二区三区四区免费看 | 男女男精品视频| www久久久久久久| 欧美va在线播放| 日韩视频网站在线观看| 7777在线视频| 99视频精品全部免费在线| 无码久久精品国产亚洲av影片| 欧美成人一区二区三区电影| 日韩有码av| 超碰在线免费av| 一本一道波多野结衣一区二区| 黄色片免费在线观看| 国产精品video| 中文字幕一区二区三区乱码图片| 风间由美一二三区av片| 欧美美女bb生活片| 一区二区乱码| 亚洲 欧美 综合 另类 中字| 国产日韩欧美不卡在线| 人妻丰满熟妇av无码区hd| 国产欧美日韩视频|