ReactiveCocoa(二)

前言

通过ReactiveCocoa(一)的学习,相信大家对ReactiveCocoa有了一些基本认识吧。下面就让我们来学习ReactiveCocoa的一些基本使用吧!

ReactiveCocoa基本使用

代替代理

在ReactiveCocoa(一)中讲到可以通过RACSubject代替代理,我们也可以通过rac_signalForSelector同样代替代理。

代码演练
// 需求:自定义redView,监听红色view中按钮点击
// 之前都是需要通过代理监听,给红色View添加一个代理属性,点击按钮的时候,通知代理做事情
// rac_signalForSelector:把调用某个对象的方法的信息转换成信号,就要调用这个方法,就会发送信号。
// 这里表示只要redV调用btnClick:,就会发出信号,订阅就好了。
[[redV rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
    NSLog(@"点击红色按钮");
}];

代替KVO

rac_valuesAndChangesForKeyPath:用于监听某个对象的某个属性发生变化。

代码演练
// 需求:每点击一次,年龄增加一次
// 定义一个age属性
- (void)obserVer {
    [[self rac_valuesForKeyPath:@"age" observer:nil] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    self.age ++;
}

监听事件

rac_signalForControlEvents:用于监听某个事件。

代码演练
// 把按钮点击事件转化成信号,点击按钮,就会发送信号
[[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside]      subscribeNext:^(id x) {
        NSLog(@"监听按钮点击事件");
 }];

代替通知

rac_addObserverForName:用于监听某个通知。

代码演练
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
    NSLog(@"弹出键盘");
}];

监听文本框文字改变

rac_textSignal:用于监听文本框文字发生改变

代码演练
[[self.textField rac_textSignal] subscribeNext:^(id x) {
    NSLog(@"text:%@",x);
}];

处理当界面有多个请求时,需要都获取到数据,才能展示界面

rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发selector参数的方法。

注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据,否则运行时会报错。

代码演练
- (void)test{
    // 创建信号A
    RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            NSLog(@"数据请求1");
            [subscriber sendNext:@"发送请求1回来的数据"];
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"随便写写");
            }];
        }];
    
    // 创建信号B
    RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSLog(@"数据请求2");
        [subscriber sendNext:@"发送请求2回来的数据"];
        return nil;
    }];
    
    // RAC:就可以判断两个信号有没有都发出内容
    // SignalsFromArray:监听哪些信号的发出
    // 当signals数组中的所有信号都发送sendNext就会触发方法调用者(self)的selector
    // 注意:selector方法的参数不能乱写,有几个信号就对应几个参数
    // 不需要主动订阅signalA,signalB,方法内部会自动订阅
    [self rac_liftSelector:@selector(doneNextWithA:andB:) withSignalsFromArray:@[signalA,signalB]];
}

- (void)doneNextWithA:(NSString *)a andB:(NSString *)b {
     NSLog(@"请求完成,更新UI--a:%@,b:%@",a,b);
}

ReactiveCocoa常见宏

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ReactiveCocoa(二)

    Scott_Mr
  • 自定义转场详解(一)

    Scott_Mr
  • Carthage的安装和使用

    Scott_Mr
  • 一名程序媛的高级Android面试总结

    现在的市场环境确实不大好,裁员与及在预谋裁员的公司一大把,当然招人的公司也有。楼主这几天去面试了几家公司,目的有以下几点:

    Android技术干货分享
  • 字节跳动EE部门前端面试经历及总结

    你好,我是星辉,幸会幸会。 今天下午我参加了字节跳动EE部门的前端视频第一次面试,把它记录总结下来,希望能够对大家带来帮助。

    星辉
  • 每日一道面试题 【征集令】& 【eBay】 面试经验分享

    最近参加了不少面试,深深感受到了面试的侧重点和平时工作所用到的东西差异还是不小的,或许是我本来基础缺失,所以有些面试经历都不是很愉快。

    周三不加班
  • 提醒西安手机棋牌游戏创业者:没趟过浑水就别想进入游戏开发领域

    手机棋牌游戏在房卡模式的全面爆发后,又因其投资成本低、回报率高的特点,西安手机棋牌游戏开发需求迅速增长。作为一般的创业者多以加盟的方式进入棋牌游戏市场,但西安游...

    西安弈聪软件公司
  • MySQL 8.0.17 clone插件的使用

    mysql8.0.17里 引入了一个clone插件, 可以方便我们快速克隆出一个从库或者MGR的节点:

    二狗不要跑
  • Markdown——test

    类 Setext 形式是用底线的形式,利用 = (最高阶标题)和 - (第二阶标题),例如:

    shirayner
  • 剑指offer——字符流中第一个不重复的字符

    题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中...

    AI那点小事

扫码关注云+社区

领取腾讯云代金券