学习笔记之MVVM+RAC
公司项目之前的很多年一直是用MVC框架,最近项目改版(加重构)提出了使用MVVM + RAC的框架结构,以达到各个部分模块代码之间的解耦。关于MVVM 以及RAC 还不太了解的同学请自行百度,我这里主要讲解下简单的使用。
以登录界面为例,需求如下:
- 注册用户输入手机号密码登录
- 手机号获取验证码快速登录
- 游客登录
- 第三方(QQ,微信…)登录
UI部分不多说 自定义各种textfield以及button ,主要讲下viewmodel里面的内容
@interface LoginViewModel : UIView
@property (nonatomic, assign) LoginType loginType;//各种登录类型
@property (nonatomic, strong) NSString *loginAccount;
@property (nonatomic, strong) NSString *loginPsd;
@property (assign, nonatomic) NSTimeInterval timeInterval;
/**
登录 点击
*/
@property (nonatomic, strong) RACCommand *loginCommand;
/**
游客登录 点击
*/
@property (nonatomic, strong) RACCommand *guestLoginCommand;
/**
获取验证码 点击
*/
@property (nonatomic, strong) RACCommand *getCodeCommand;
/**
验证码倒计时 变动
*/
@property (nonatomic, strong) RACSubject *codeIntervalSubject;
/**
登录成功
*/
@property (nonatomic, strong) RACSubject *loginSuccessSubject;
/**
第三方登录 点击
*/
@property (nonatomic, strong) RACCommand *thirdLoginCommand;
@end
VM中处理网络请求和业务逻辑 处理成功之后发一个成功的信号出去
@interface LoginViewModel()<KooHttpDelegate>
@property (weak, nonatomic) NSTimer *myTimer;//验证码倒计时
@end
@implementation LoginViewModel
#pragma mark - Setter
- (void)setTimeInterval:(NSTimeInterval)timeInterval
{
_timeInterval = timeInterval;
//把时间值传出 用于刷新UI
[self.codeIntervalSubject sendNext:[NSNumber numberWithLong:_timeInterval]];
if(_timeInterval == 0)
{
[self endTimer];
}
}
#pragma mark - Getter
- (RACSubject *)loginSuccessSubject
{
if (_loginSuccessSubject == nil)
{
_loginSuccessSubject = [RACSubject subject];
}
return _loginSuccessSubject;
}
- (RACSubject *)codeIntervalSubject
{
if (_codeIntervalSubject == nil)
{
_codeIntervalSubject = [RACSubject subject];
}
return _codeIntervalSubject;
}
- (RACCommand *)loginCommand
{
if (_loginCommand == nil)
{
@weakify(self);
self.loginCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(