前言:

很早之前就有看过ReactiveCocoa,那会看的时候知道是一个新的框架关于响应式编程,具体什么也没有深入研究,今天也对ReactiveCocoa这个框架的使用进行了一定的了解。在github中有对它一个简单的介绍:

大概的意思就是说ReactiveCocoa这个框架灵感来源于响应函数式编程思想,RAC提供的“事件流”概念,采用能够超时发送的信号和信号产生者来替代以前通过声明多种变量。事件流统一了以前的所有事件响应方式,包括代理,block回调,通知,target-action,观察者模式等。因为这些都是事件响应的不同方式而已,所以统一成同一种方式更方便程序员管理代码。

到这里我们就初识ReactiveCocoa,它是统一多种事件响应方式的一个github发布的开源框架。

ReactiveCocoa在github上面的地址:https://github.com/ReactiveCocoa/ReactiveCocoa。

将框架下载下来打开可以看见框架对foundation框架和UIkit框架添加了一个分类来实现对事件响应方式进行统一的。

ReactiveCocoa:

ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情和监听的事情的代码放在一起方便程序员的管理,符合开发中高聚合,低耦合的思想。
ReactiveCocoa框架中核心类:RACSignal(信号类),一般表示当有人订阅该信号的时候,信号内部会发送数据,RACSignal本身这个类不会发送数据,能够发送数据的时候block回调里面的那个订阅者。

RACSignal:

RACSignal的使用可分为两个步骤:创建信号和订阅信号。关于信号的发送和接收在block回调中执行。具体看下面的方法:
 - (void)useTheRACSignal
{
/**
* 创建信号
*/
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
/**
* 这个block是在该信号执行subscribeNext被订阅的时候自动调用
*/
// 发送信号
[subscriber sendNext:@"value"];// subscriber 表示订阅者用于发送对象的 // 发送信号结束后如果不再发送信号最好调用一下发送完成方法取消订阅信号
[subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
//RACDisposable用于取消订阅和清理资源的,在信号发送完成或者失败的时候调用
// 这个block调用的时候:当信号发送完成或失败的时候自动执行这个block取消订阅者
// 执行完这个block后,当前信号就不在被订阅了
NSLog(@"信号就不再订阅的范围内");
}];
}];
// 订阅该信号,否则该信号一直都是冷信号,值改变了也不会触发,只有订阅了该信号才会触发,信号才会变成热信号.信号订阅调用的是subscribeNext方法
[signal subscribeNext:^(id x) {
// 该block调用的时候:每当有信号发出的时候就会回调该block
NSLog(@"接收到数据:%@",x);
}];
// 信号可以被多次订阅
[signal subscribeNext:^(id x) {
NSLog(@"第二次订阅 %@",x);
}];
}

RACSubject:

信号提供者类:RACSubject,能够充当信号,又能够发送信号

RACSubject的简单使用:

 -(void)useTheRACSubject
{
// * 创建信号,创建信号的时候没有block回调
RACSubject *signalSubject = [RACSubject subject];
// 订阅该信号(可以多次订阅该信号)
[signalSubject subscribeNext:^(id x) {
//block回调的时候就是接受到数据的时候
NSLog(@"第一次订阅,接受到的数据:%@",x);
}];
[signalSubject subscribeNext:^(id x) {
NSLog(@"第二次订阅,接收到的数据%@",x);
}];
// 发送信号
[signalSubject sendNext:@"wahaha"];
}

RACReplaySubject:

重复提供信号类:RACReplaySubject,这是RACSubject的子类,跟RACSubject的区别就是可以先发送信号再订阅,多次发送的值在订阅的时候都能够收到数据

RACReplaySubject的简单使用:

- (void)useTheRACReplaySubject
{
// 创建信号
RACReplaySubject *replaySubject = [RACReplaySubject subject];
// 发送信号(在没有订阅该信号之前就可以先发送值,在以后订阅信号的时候都会收到)
[replaySubject sendNext:@];
[replaySubject sendNext:@];
// 订阅该信号
[replaySubject subscribeNext:^(id x) {
NSLog(@"第一次订阅,收到的值: %@",x);
}];
[replaySubject subscribeNext:^(id x) {
NSLog(@"第二次订阅,收到的值:%@",x);
}];
}

利用ReactiveCocoa充当代理的功能实现页面间传值:

大概思路就是:在跳转的第二个页面中定义一个RACSubject类型的属性,在第一个页面要跳转到第二个页面的时候创建这个信号并且订阅这个信号,在第二个页面跳转回来的时候让这个信号发送值出来。部分代码如下:

第一个页面的buttonAction:

 SecondViewController *secondVC = [[SecondViewController alloc]init];
//创建信号
secondVC.subject = [RACSubject subject];
// //订阅第二个页面的信号,当第二个页面的信号发送value的时候在这里回调就改变这个页面的颜色
[secondVC.subject subscribeNext:^(id x) {
UIColor *color = (UIColor *)x;
self.view.backgroundColor = color;
}];
[self.navigationController pushViewController:secondVC animated:YES];

第二个页面的.h文件中:

 #import <UIKit/UIKit.h>
#import "ReactiveCocoa.h"
@interface SecondViewController : UIViewController
@property(nonatomic,strong)RACSubject *subject;
@end

第二个页面的.m文件中返回按钮的方法:

 - (void)backAction:(UIBarButtonItem *)btn
{
UIColor *color = [UIColor redColor];
[self.subject sendNext:color];
[self.navigationController popViewControllerAnimated:YES];
}

ReactiveCocoa中信号的使用的更多相关文章

  1. ReactiveCocoa 中 RACSignal 是怎样发送信号

    前言 ReactiveCocoa是一个(第一个?)将函数响应式编程范例带入Objective-C的开源库.ReactiveCocoa是由Josh Abernathy和Justin Spahr-Summ ...

  2. ReactiveCocoa 中 RACSignal 是如何发送信号的

    https://juejin.im/post/5829f4c3570c350063c436ac 前言 ReactiveCocoa是一个(第一个?)将函数响应式编程范例带入Objective-C的开源库 ...

  3. Qt 5中信号和槽的新语法

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  4. 自己用纯C++实现简单的QT中信号与槽机制

    前天在我很久以前的一篇博文 (http://blog.csdn.net/liukang325/article/details/45742675) 中有人回复说看到我的博文很激动,希望我详细介绍一下信号 ...

  5. QT_5_ Qt中信号和槽 + 自定义信号和槽 + lambda 表达式

    1.Qt中信号和槽 1.1 需求:点击按钮关闭窗口 1.2 利用connect进行链接 1.3 参数1 信号发送者(指针) 参数2 发送的信号(信号地址) 参数3 信号的接受者(指针) 参数4 处理槽 ...

  6. linux中信号的API详解实例

    /************************************************************************* > File Name: signal.c ...

  7. 为什么ReactiveCocoa中推荐使用RACSignal来做信号处理而不是RACSubject

    原文解释在这里http://cocoadocs.org/docsets/ReactiveCocoa/0.6.0/ 在标题Creating hot subscribables 底下 先贴原文: The ...

  8. 从 ReactiveCocoa 中能学到什么?不用此库也能学以致用

    从知道ReactiveCocoa开始就发现对这个库有不同的声音,上次参加<T>技术沙龙时唐巧对在项目中已全面使用FRP的代码家提出为什么这种编程模型出现了这么长时间怎么像ReactiveC ...

  9. ReactiveCocoa 中 RACSignal 所有变换操作底层实现分析(上)

    前言 在上篇文章中,详细分析了RACSignal是创建和订阅的详细过程.看到底层源码实现后,就能发现,ReactiveCocoa这个FRP的库,实现响应式(RP)是用Block闭包来实现的,而并不是用 ...

随机推荐

  1. 比较几种工具Python(x,y) Anaconda WinPython

    浏览了一些相关的论坛,将几大工具的特点分别总结下: Python(x,y) 更新很慢,稳定性一般,默认带有很多包. WinPython  只能在windows上跑,界面友好,和Python(x,y)是 ...

  2. 模拟Jquery选择器

    目前实现的功能有以下几点: 1.$("#adom"); // 返回id为adom的DOM对象 2.$("a"); // 返回一个a标签的数组 3.$(" ...

  3. C# 事件和委托

    相信大家在面试的时候会经常问到事件和委托的区别,为什么.net中需要事件和委托这样类似的问题吧,对于一些初学者来说可平时用的过程中也不知道为什么, 只知道这样用,而对于其中的实现机制不是很清楚, 所以 ...

  4. eclipse开发web应用程序步骤(图解)

    *运行环境(也就是服务器的选择) 环境搭建好之后开始编写web程序!然后右键->Run as -> Run on Server!

  5. mongodb 监控分析命令

    1. bin/mongostate 2.开启慢查询用于调试 正式要关闭 可以在客户端调用db.setProfilingLevel(级别) 命令来实时配置.可以通过db.getProfilingLeve ...

  6. VS2010打包,遇到的一些问题和解决办法

    我用的VS2010,教程很多,我就不一一介绍了,我把我自己遇到的一些问题向大家说一下: 1 可能我比较笨吧,没有理解网上很多教程的意思,直接把图片的后缀名改了,导致添加快捷方式图标的时候出现这种情况 ...

  7. Hadoop第13周练习—HBase作业

    1    :举例子说明HBase相对简单 1.1 1.2     回答 2    :设计HBase存储站内短信 2.1 2.2     回答 书面作业1:举例子说明HBase相对简单 请举出一例子,使 ...

  8. SQL中的连接查询及其优化原则

    连接查询是SQL的主要任务,只有很好的掌握了连接查询及其优化方法才算是掌握了SQL的精髓所在.最近在面试中遇到了有关连接查询的问题,感觉回答的不是很好,总结一下. 具体示例请参考:http://www ...

  9. WatiN和HttpWatch交互简介

    Httpwatch是一款强大的网页数据分析工具,它可以在不改变浏览器和网络设置的基础上捕捉http和https数据.查看底层的http数据,包括headers, cookies, cache等,同时统 ...

  10. ServletFileUpload(Servlet文件上传)

    //**文件上传** form表单提交必须指定Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型"multipart/form-data" //1.创建磁盘文件项目工 ...