iOS 浅谈MVVM+RAC

本文是关于iOS开发中采用MVVM+RAC框架进行重构的学习笔记。通过一个登录界面的需求,详细解释了如何在VM中处理网络请求和业务逻辑,并在Controller中进行UI布局和信号绑定,实现代码解耦,降低维护成本。对于MVVM和RAC不熟悉的同学,可以借此了解其基本用法和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习笔记之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 *(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值