这里写图片描述

ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架
Github-ReactiveCocoa地址

一直听说RAC,但一直未使用过,最近不算忙,研究和学习了一下,非常感谢
峥吖大神对RAC 的细解,受益匪浅。

ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架。

截取Github上对ReactiveCocoa的说明:

这里写图片描述

RAC是提供事件流,通过信号源和信号源提供者(产生者),信号接受者协和来完成。
借用面向对象的一句话,万物皆是流的形式,通过一方发出信号,一方接受信号来完成不同事件。

ReactiveCocoa作用

  • 代理方法
  • block 回调
  • 通知
  • 行为控制和事件的响应链
  • 协议
  • KVO
  • ……
主要作用:

高内聚,低耦合,使代码更加内聚,也便于代码的读取


响应式编程思想:

不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。

函数式编程思想:

是把操作尽量写成一系列嵌套的函数或者方法调用。
特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参
数(需要操作的值)block返回值(操作结果)。

ReactiveCocoa编程风格:

ReactiveCocoa结合了 函数式编程(Functional Programming)和 响应式编程(Reactive Programming)各自的优点,产生一种新的语法


如何导入ReactiveCocoa框架
1.CocoaPods

pod 'ReactiveCocoa'

这里写图片描述
有的需要在podfile中加入use_frameworks!,到时候终端会提醒的
我导入时需要加入target,如图所示

2.手动导入
由于工程之前一直是手动导入第三方框架,所以也希望手动添加ReactiveCocoa这个框架,但ReactiveCocoa在GitHub上并没有说明如何添加,需要哪些依赖等,所以自己直接把ReactiveCocoa整个文件夹拖到工程中,build以后,哪里报错修改哪里,最后不需要添加任何依赖,万幸,手动导入成功

ReactiveCocoa常见类。

01.RACSiganl ,在RAC中最核心的类
  • RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。

  • 只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。

  • 默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。

  • 如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。

    // 1.创建信号
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        // block调用时刻:每当有订阅者订阅信号,就会调用block。

        // 2.发送信号
        [subscriber sendNext:@"我是一个信号类"];
        // 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。
        [subscriber sendCompleted];
        // block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
        return [RACDisposable disposableWithBlock:^{
            // 执行完Block后,当前信号就不在被订阅了。
            NSLog(@"信号被销毁");
        }];
    }];
    self.signal = signal;

    // 3.订阅信号,才会激活信号
    [signal subscribeNext:^(id x) {
        NSLog(@"接收的数据:%@",x);
    }];

02.RACSubscriber:

表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。

03.RACDisposable:

用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。

[RACDisposable disposableWithBlock:^{
    // 执行完Block后,当前信号就不在被订阅了。
    NSLog(@"信号被销毁");
}];
04.RACSubject:

RACSubject:信号提供者,自己可以充当信号,又能发送信号。
RACSubject使用步骤:

  • 1.创建信号 [RACSubject subject],跟RACSiganl不一样,创建信号时没有block。
  • 2.订阅信号 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
  • 3.发送信号 sendNext:(id)value
// 1.创建信号
    RACSubject *subject = [RACSubject subject];
    // 2.订阅信号
    [subject subscribeNext:^(id x) {
        // block调用时刻:当信号发出新值,就会调用.
        NSLog(@"第一个订阅者:%@",x);
    }];
    [subject subscribeNext:^(id x) {
        // block调用时刻:当信号发出新值,就会调用.
        NSLog(@"第二个订阅者:%@",x);
    }];
    // 3.发送信号
    [subject sendNext:@"发送信号"];

ReactiveCocoa在开发中常见的用法

Event(按钮的点击)
    // 监听事件
    // 把按钮点击事件转换为信号,点击按钮,就会发送信号
    [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
        NSLog(@"按钮被点击");
    }];

KVO观察者
    // 监听对象的属性值改变,转换成信号,只要值改变就会发送信号
    [[View rac_valuesAndChangesForKeyPath:@"x" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
        NSLog(@"view的x值发生了改变");
    }];
Notification通知
    // 代替通知
    // 把监听到的通知转换信号
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
        NSLog(@"键盘将要出现");
    }];

    // 通过RAC提供的宏快速实现观察者模式
    // RACObserve(self, name):监听某个对象的某个属性,返回的是信号。
    [RACObserve(self.greenView,x) subscribeNext:^(id x) {
        NSLog(@"绿色view的x方向发生改变");
    }];

textField的文字信号
    // 监听文本框的文字改变
    [[_textField rac_textSignal] subscribeNext:^(NSString *x) {
        NSLog(@"文本框文字发生了改变:%@",x);
    }];

    // 通过RAC提供的宏快速实现textSingel的监听
    // RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某个属性绑定。
    // 当textField的文字发生改变时,label的文字也发生改变
    RAC(self.textLabel,text) = self.textField.rac_textSignal;

手势信号
    // 监听手势
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] init];
    [[tapGesture rac_gestureSignal] subscribeNext:^(id x) {
        NSLog(@"view被触发tap手势");
    }];
    [self.view addGestureRecognizer:tapGesture];
过滤器filter方法的使用
    // 过滤器
    [[self.textField.rac_textSignal filter:^BOOL(NSString *value) {
        return value.length >= 3;
    }] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];

这些只是对 ReactiveCocoa 的初步了解以及基本使用,还有更多功能和方法,需要我们去慢慢研究

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐