iOS-ReactiveCocoa(RAC)的初步了解以及基本使用

来源:互联网 发布:北京java薪资待遇 编辑:程序博客网 时间:2024/04/29 23:36

这里写图片描述

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 的初步了解以及基本使用,还有更多功能和方法,需要我们去慢慢研究

0 0