浅谈ReactCocoa与MVVN,MVC关系,及基本使用

本文介绍ReactiveCocoa (RAC) 在iOS开发中的使用,包括其结合函数式编程和响应式编程的特点,以及如何通过RAC实现MVVM架构。文章详细展示了如何使用RAC进行数据请求和处理,并提供了具体的代码示例。

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

简介

RAC全程ReactiveCocoa,是由Github开源的一个应用于iOS和OS开发的新框架。RAC结合了函数式编程(Functional Programming)和响应式编程(Reactive Programming),其中的函数式编程一直比较难以理解,最近在使用链式调用的过程当中,才获得进一步理解。

RAC5与其他版本区别 参考:http://blog.youkuaiyun.com/zhanglizhi111/article/details/73163676

浅谈MVVM的架构设计与团队协作 参考: http://www.cnblogs.com/ludashi/p/4211556.html

MVVN与MVC及OC传统项目理解

我个人对MVVM的理解主要是借鉴于之前浅尝VUE.js,MVVM就是基于数据绑定实现UI变化,通属来说即数据变,UI变; 而对于OC项目来说,由于苹果范例也是MVC为主,如果要实现MVVN必须复写数据绑定层,虽然最终会减轻C层代码量,但是最终还是会增加总代码量。由于最近重构信息流,我折中做了一种变种MVC专门针对处理,M层作为ViewModel(只传递数据,并且数据需要缓存),C层做为(只处理各种点击事件,控制器之间会用RAC作为解耦,另外,增加一个专做请求和各种数据排序和组合的请求层),V层(由一个专门根据ViewModel层做UI选择控制层,各种元件VIEW的组合)。 简而言之,就是MVC基础生,增加请求层和UI控制层。

//数据顺序 简图 可能描述会不够恰当
请求层请求数据(排序处理生成真实数据排序)-> C层 -> 通知V控制层处理UI变化->V控制层生成UI数据->C层按UI数据模型显示->C层事件->请求数据层再次请求数据->重复->重复->重复->重复->重复

pod安装

pod 'ReactiveObjC'

结合AFNWORKING使用

封装请求
/**
 获取热点新闻列表

 @param snapShotNumber snapShotNumber description
 @param pageNum pageNum description
 @return RACSignal object
 */
+ (RACSignal*)hotNews:(long long)snapShotNumber pageNum:(long long)pageNum{
    
    return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        NSString* url = kURL(kHotNews);
        
        NSMutableDictionary *paras = [NSMutableDictionary dictionary];
 
        
        [paras setObject:@(snapShotNumber) forKey:@"snapShotNumber"];
        [paras setObject:@(10) forKey:@"pageSize"];
        [paras setObject:@(1) forKey:@"getPages"];
        [paras setObject:@(pageNum) forKey:@"pageNum"];

        NetworkOptionShareIntance.ttv_netWorkSericeType = TTVNetWorkPortNewsServiceType;
        [TTVNetworkManager ttv_GET:url parameters:paras  success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            [subscriber sendNext:responseObject];
            [subscriber sendCompleted];
        } failure:^(NSURLSessionDataTask * _Nullable task, TTVNetWorkError * _Nonnull error) {
            [subscriber sendError:error];
            [subscriber sendCompleted];
        }];

        return nil;
    }];
}
使用封装
- (void)fetchDataWithLoadMore:(BOOL)loadmore handle:(void (^)(BOOL succ, NSInteger newsnum, BOOL showResultInfo))completion {
    NSMutableArray* racList = [NSMutableArray array];
    [racList addObject:[TTVApiService channelAdvertise:self.channID]];
    [racList addObject:[TTVApiService hotNews:self.lastModel.snapShotNumber pageNum:self.pageNum + 1]];

    RACSignal* combine = [RACSignal combineLatest:racList];
    [combine subscribeNext:^(id  _Nullable x) {
        [self saveChannel];        
        NSArray* adList =  [x objectAtIndex:0][@"adList"];
        NSString* adHash =  [x objectAtIndex:0][@"hash"];
        NSDictionary *recvModelDic = [x objectAtIndex:1];
        
    } error:^(NSError * _Nullable error) {
        completion(NO, 0, YES);
    }];
}

监控对象方法

            UIViewController* vc = [TTVJumpManager jumpToMediaDetail:self newsDetailModel:newsModel pushModel:nil newsDataUpdateBlock:nil];
            [[vc rac_signalForSelector:@selector(didMoveToParentViewController:)] subscribeNext:^(id  _Nullable x) {
               RACTupleUnpack(UINavigationController* navigationController) = x;
                if (navigationController == nil) {
                    [self updateNavigationViewStatue];
                }
           }];

快捷处理RAC对象

//解包rac对象
RACTupleUnpack(UINavigationController* navigationController) = x;

//封包个对象成为rac对象
RACTuplePack(key, value);

原文:http://raychow.linkfun.top/2017/12/08/archives/1_ios/reactcocoa/index/

转载于:https://my.oschina.net/u/3729367/blog/1587133

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值