推广

iOS中的RAC的使用

iseeyu2年前 (2024-02-21)推广130

图片.png

主要在于 ViewModel
ViewModel: 相比较于MVC新引入的视图模型。是视图显示逻辑、验证逻辑、网络请求等代码存放的地方,唯一要注意的是,任何视图本身的引用都不应该放在VM中,换句话说就是VM中不要引入UIKit.h (对于image这个,也有人将其看做数据来处理,这就看个人想法了,并不影响整体的架构)。

比如一个用户登录网络请求,将网络请求相关逻辑都放到viewModel中执行

@interface GHLoginViewModel : NSObject

@property (nonatomic, strong) RACCommand *loginCommand;

@property (nonatomic, strong) RACCommand *refreshTokenCommand;


@interface GHLoginRequest : GHNetworkBaseRequest

/// 手机号\邮箱
@property (nonatomic, copy) NSString *username;

/// 密码(密码由 8 - 128 字符组成,不能为纯数字或字母)
@property (nonatomic, copy) NSString *password;

/// 国家码简称
@property (nonatomic, copy) NSString *region_code;

/// 手机号国家码
@property (nonatomic, copy) NSNumber *phone_code;

@end

@implementation GHLoginViewModel

- (instancetype)init
{
    self = [super init];
    if (self) {
    }
    return self;
}

- (RACCommand *)loginCommand {
    if (!_loginCommand) {
        _loginCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(GHLoginRequest* _Nullable input) {
            return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
                NSString *taskId = [GHNetworkModule.share sendRequest:input cacheComplete:nil networkComplete:^(GHNetworkResponse *response) {
                    if (response.status == GHNetworkResponseStatusSuccess) {
                        GHUserInfo.share.password = input.password;
                        GHUserInfo.share.token = response.data[@"token"];
                        [subscriber sendNext:response.data];
                        [subscriber sendCompleted];
                        [GHUserInfo cacheInfo];
                    } else {
                        [subscriber sendError:response.error];
                    }
                }];
                return [RACDisposable disposableWithBlock:^{
                    [GHNetworkModule.share cancelRequestWithRequestID:taskId];
                }];
            }];
        }];
    }
    return _loginCommand;
}

在viewcontoller中接收请求结果

    //返回数据处理
    [self.viewModel.loginCommand.executionSignals.switchToLatest subscribeNext:^(id  _Nullable x) {
        @strongify(self)
        [GHHudTip hideHUDWithView:self.view];
    }];
    
    //异常处理
    [self.viewModel.loginCommand.errors subscribeNext:^(NSError * _Nullable x) {
        @strongify(self)
        [GHHudTip hideHUDWithView:self.view];
        [GHHudTip showTips:x.domain];
    }];
    

延伸与扩展:iOS MVVM+RAC 从框架到实战

结语:RAC的功能非常强大,且实用。这里只是列举了一小部分。其他还需要我们在开发中慢慢发掘。加油~

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56876.html

相关文章

灾祸与挫折,是人们自身的宝贵财富,知道为什么吗?

灾祸与挫折,是人们自身的宝贵财富,知道为什么吗?

灾祸与挫折,是人们自身的宝贵财富,知道为什么吗?我是一个极为不安分的人,我喜欢创作,喜欢体验新的,不喜欢龟缩在一个环境之中,不喜欢一眼看到头的生活方式。所以,在我的事业有所成就之后,我选择了辞职。创业初期,几乎没有任何收入,我的人生陷入到了最低谷。迷茫过、痛苦过、懊悔过,但...

哪些seo优化手法不利于关键词排名。

哪些seo优化手法不利于关键词排名。

做网站优化,首先要学会诊断网站问题,从基本的网站TDK(title,description,keywords)到网站代码,框架,内链,外链,锚文本,404,301等等,更不要说精通了,至少要知道该做什么和该做什么。雷区不可触碰,否则你的网站只会有一个死胡同。今天,小编和大家谈谈网站优化的操作,它不利...

SEO良好习惯—做好预先准备工作。

SEO良好习惯—做好预先准备工作。

相信每一个成功的优化都有一个成功的准备工作,盲目的进行网站优化会让网站优化失去重点。ER进行网站优化的时候,一定要做好准备工作,让准备工作为网站优化打好基础,从而进行有备无患的网站优化。那么到底是哪些准备工作呢。 1、确定网站目标。在进行网站优化的时候不能盲目的进行优化,一定要先确定自己的目...

简单聊聊快手国际化

最近国内拼多多、快手等互联网企业推进国际化业务引起业界关注。拼多多9月1日正式上线跨境平台Temu,首站北美,在经济增长放缓、国内流量红利触顶的情况下,企业出海实现国际化的步伐在加快,寻找新的增量,此前异观财经做过一篇题为《拼多多出海,Temu面临的机会与挑战》的观点分享,...

网络营销干货:针对SEM竞价没有流量的解决方案。

网络营销干货:针对SEM竞价没有流量的解决方案。

做没有流量怎么办?今天我从流量提升的方法和流量的选择两方面为大家进行解读,希望你学有所获! 在汉语言里面有两句俗语:一个是"巧妇难为无米之炊"、一个是"工欲善其事必先利其器",意思大概一样,理解为一件事想要做好,要有好的工具或者鼎力的支持! 挪用到SEM领域来讲,巧妇难为无米之炊意为:...

排名是SEO推广唯一的衡量指标吗。

排名是SEO推广唯一的衡量指标吗。

一直以来,当我们讨论SEO的成功时,我们经常把搜索引擎排名作为一个重要的衡量标准。但有时,我们会坐下来静静地思考SEO排名的价值吗?我们的客户真的关心你的排名吗?那么,排名是SEO推广唯一的衡量指标吗?下面小编就跟大家详细解读下,一起来看看吧! 1.排名查询 理论上,对于SEO员工...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片