成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

談談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

架構網絡請求代碼

2017-04-14 15:42:14

2023-01-05 11:27:27

技術架構

2022-11-16 14:18:03

數據湖數據倉庫數據架構

2021-12-27 08:04:49

架構網站高并發

2023-05-16 08:01:13

架構網站演進

2017-11-09 10:28:45

軟件定義網絡

2013-12-11 17:10:53

2017-02-27 09:36:01

AndroidMVVM架構

2013-06-20 10:28:39

MVVM框架avalon架構

2016-07-01 16:13:13

AWSLambda

2012-04-16 15:08:33

2017-07-20 11:18:22

Vue.jsMVVMMVC

2021-01-12 08:20:51

AndroidActivity系統

2017-06-02 09:47:29

網絡分層協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91av入口| 三级视频在线观看 | 美国av毛片| 欧美a视频 | 国内精品伊人久久久久网站 | 成人在线观看免费视频 | 成人激情视频在线 | 国产精品亚洲精品 | 欧美日韩成人在线 | 国产乱码高清区二区三区在线 | 狠狠爱综合网 | 美国a级毛片免费视频 | 久久国产精品一区二区三区 | 免费在线观看av | 欧美一区免费在线观看 | 国产精品久久国产精品 | 操视频网站 | 久久午夜精品福利一区二区 | 久久久久成人精品 | 在线观看视频亚洲 | 噜噜噜噜狠狠狠7777视频 | 久久久国产精品入口麻豆 | 久视频在线观看 | 欧美成人免费在线视频 | 午夜99| 久久人人爽人人爽人人片av免费 | 色婷婷综合久久久久中文一区二区 | 欧美精品欧美精品系列 | 日韩欧美在线免费观看 | 久久国产精品免费一区二区三区 | 91久久国产精品 | 日韩欧美在线观看视频 | 麻豆精品久久久 | 黄色网址在线播放 | 91婷婷韩国欧美一区二区 | 99久久99热这里只有精品 | 国产亚洲成av人在线观看导航 | 国产成人精品一区二区三 | 99精品在线| 国产福利在线小视频 | 亚洲黄色一级 |