一直听闻ReactiveCocoa(以下简称RAC)的大名,但始终没有使用。最近时间比较空闲就决定研究一下。

在配置RAC时候遇到了一个小麻烦需要说明本人用cocoapods管理第三方框架,于是按照正常流程在终端中

输入pod search ReactiveCocoa,找到搜索结果

于是vim 打开Podfile 录入

pod 'ReactiveCocoa', '~> 3.0.0-alpha.1'

结果cocoapods始终安装不了 原因竟是3.0.0支持的是swift

于是重新录入pod 'ReactiveCocoa' 就能安装成功并使用了

RAC:响应式编程,使用的过程紧记一个词语Signal(信号),个人感觉RAC主要就是用信号来进行管理和操作

下面来讲解一些基本的使用方法

1.文本框普通监听,创建有usename的一个文本框

     //对象.rac_textSignal返回RACSignal对象(理解为rac信号)
//每次next事件发生时,subscribeNext:方法提供的block都会执行。
//因为对象类型已定(如此处为UITextFeild),所以形参中的属性可以转化成对应属性
[self.usename.rac_textSignal subscribeNext:^(id x) {
NSLog(@"first = %@",x);
}];

在文本框内录入abcd时得到打印结果如下

此处可以看到有多余的2个空字符串,第一行我理解为被创建的时候调用了一次block方法,第二行为成为第一响应者时调用的

由录入可以看出每当文本框有所事件时,都会调用next(下一步)方法中的block。

这样有前两个空白的明显不是我们所想要的效果,于是RAC里面就设计了filter(过滤器)来进行判定

     //filter(过滤器)用于限定subscribeNext执行条件
[[self.usename.rac_textSignal filter:^BOOL(id value) {
NSString *text = value;
return text.length >;
}] subscribeNext:^(id x) {
NSLog(@"second = %@",x);
}];

此时我们再按照上面方式录入abcd后得到打印结果

此时就得出我们想要得到的结果,但是这样看来限定条件看来只能是字符串(value)本身吗?

其实RAC还给我们提供了一个map(转换)来改变value的类别,例如

     //设置map后 filter中的value为 map块中return的对象
[[[self.usename.rac_textSignal map:^id(NSString *value) {
NSLog(@"map ===%@",value);
return @(value.length);
}] filter:^BOOL(id value) {
NSLog(@"filter ===%@",value);
return [value integerValue] > ;
}] subscribeNext:^(id x) {
NSLog(@"输出成功");
}];

此时我们同样录入abcd后得到打印结果

由此可以看出filter的类型变为了NSnumber类型,以上便是三个RAC使用最基本的知识点 map(转化) filter(过滤) next(下一步)

2.Button点击事件

平常设置button点击事件的时候还需要设置另外一个方法,在RAC中则可以不用这儿做

 #pragma mark 按钮普通设置方式
[[self.enterButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"信号1:被点击了%@",x);
}];
[[self.enterButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"信号2:被点击了%@",x);
}];
#pragma mark 按钮第二种设置方式
//点击代理事件,会使按钮可enabled一直为YES
self.enterButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(UIButton *input) {
if ([self.password.text isEqualToString:@""] && [self.usename.text isEqualToString:@"bai"]) {
NSLog(@"正确");
[[NSNotificationCenter defaultCenter] postNotificationName:@"isLogin" object:nil];
}else{
NSLog(@"错误");
}
self.name = [self.usename.text mutableCopy];
return [RACSignal empty];
}];

当我点击按钮后得到打印结果如下

这样就完成了button按钮点击的回调,在此处结果可以看出一个控件是可以创建多个signal(信号)的

3.信号合并

     //rac_textSignal 或者map:都会返回一个RACSigna类型的信号
RACSignal *usename = [self.usename.rac_textSignal map:^id(id value) {
NSString *text = value;
return @(text.length);
}];
RACSignal *password = [self.password.rac_textSignal map:^id(id value) {
NSString *text = value;
return @(text.length);
}];
//将usename同password信号合并创建新的haveTextSignal信号。combneLatest:(需要合并的信号数组)reduce:(对应信号的value)
RACSignal *haveTextSignal = [RACSignal combineLatest:@[usename,password] reduce:^id(NSNumber *usename,NSNumber *password){
return @([usename boolValue] && [password boolValue]);
}];
//设定haveTextSignal信号来控制按钮是否可以被点击
[haveTextSignal subscribeNext:^(id x) {
NSNumber *num = x;
self.enterButton.enabled = [num boolValue];
}];

此时的结果是当文本框都没有值时登录按钮不能被点击,都有值才能点击登录按钮(截图不规范,只为展示)

4.kvo和通知的RAC使用

由于kvo和通知的用法较为简单这边直接上代码

  /*
其中block会对其中对象进行强引用,为防止循环引用其中的全局对象最好采用弱引用类型
RAC语法 block外部@weakify(self) block内部@strongify(self)
接着可直接在block内部使用self
*/
//kvo
@weakify(self)
RAC(self.usename,backgroundColor) = [self.usename.rac_textSignal map:^id(id value) {
@strongify(self)
return self.usename.text.length > ? [UIColor orangeColor] : [UIColor clearColor];
}]; //Notification方法
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"isLogin" object:nil] subscribeNext:^(id x) {
NSLog(@"成功登陆");
}];

到此RAC的基本使用方法就介绍完毕,当然RAC框架的内容远远不止这些,单个人觉得这些属于比较实用部分,就只研究了这一部分。

如果以后还有RAC的研究会在此基础上增加。

最新文章

  1. 博客使用BOS上传图片
  2. KMS安装后激活机器
  3. #Linux学习笔记# Linux在线帮助文档man page
  4. MVC:上传文件
  5. Qt中的键盘事件,以及焦点的设置(比较详细)
  6. Dubbo认识
  7. Leetcode 102. Binary Tree Level Order Traversal(二叉树的层序遍历)
  8. C语言基础课程 第二课 HelloWorld不为菜鸟所知的秘密
  9. Spring Boot 入门概念介绍
  10. hdu4419 Colourful Rectangle 12年杭州网络赛 扫描线+线段树
  11. C#私房菜[二][提供编程效率的技巧]
  12. 前端的UI设计与交互之色彩篇
  13. 【转载】 Sqlserver中DateAdd()函数
  14. [Linux] Nginx 提供静态内容和优化积压队列
  15. js 性能篇--dom 重绘 重排 节流
  16. poj 3177 Redundant Paths(边双连通分量+缩点)
  17. 20155208实验二 Java面向对象程序设计
  18. Android Notification 的声音和震动
  19. 微信公众号关联(小游戏 小程序 跳转 盒子 wx.navigateToMiniProgram)
  20. Android无线调试(转)

热门文章

  1. Mysql 如何做双机热备和负载均衡
  2. 28、Oracle(四)用户权限控制
  3. Android GridView 第一个Item 点击没反应
  4. Check the difficulty of problems
  5. Java学习之路(四)
  6. CountDownLatch、CyclicBarrier和Semaphore
  7. JAVA获取密钥公钥的keytool的使用
  8. ubuntu截屏
  9. XMLHttpRequest 2.0与FileReader接口的方法
  10. Spark系列之二——一个高效的分布式计算系统