成人免费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

2022-03-02 15:31:32

架構網絡請求代碼

2013-01-04 10:03:32

AjaxASP.NET

2023-01-05 11:27:27

技術架構

2017-04-14 15:42:14

2022-11-16 14:18:03

數據湖數據倉庫數據架構

2021-12-27 08:04:49

架構網站高并發

2017-11-09 10:28:45

軟件定義網絡

2013-12-11 17:10:53

2023-05-16 08:01:13

架構網站演進

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技術棧公眾號

主站蜘蛛池模板: 中国一级大毛片 | 国内精品一区二区三区 | 精品国产乱码久久久久久久久 | 成人一区二区三区在线观看 | 亚洲综合视频 | 亚洲 中文 欧美 日韩 在线观看 | 中文字幕在线第一页 | 日本一区二区三区在线观看 | 国产精品小视频在线观看 | 久久精品国产一区 | 人人天天操| 99精品免费视频 | 久久国产秒 | 天堂网av在线 | 在线观看日韩 | 午夜在线免费观看 | 久久av影院 | 国产激情片在线观看 | 日韩1区| 亚洲精品综合 | 91在线观看免费视频 | 国产精品久久网 | 精品日韩一区 | 久久影音先锋 | 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲精品影院 | 欧美成人手机视频 | 精品久久99 | 亚洲成人一区二区 | 色伊人| 看毛片的网站 | 亚洲黄色片免费观看 | 中文字幕免费在线 | 国产999精品久久久久久绿帽 | 操久久| 久久精品日产第一区二区三区 | 一区二区免费看 | 蜜月va乱码一区二区三区 | 精品三区 | 日本 欧美 国产 | 毛片入口 |