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常见宏
RAC(TARGET, ...)
用于给某个对象的某个属性绑定。
// 只要文本框文字改变,就会修改label的文字
RAC(self.labelView,text) = _textField.rac_textSignal;
RACObserve(TARGET,KEYPATH)
监听某个对象的某个属性,返回的是信号
[RACObserve(self, age) subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
@weakify(Obj)和@strongify(Obj)
一般都是成对出现,为了避免引起循环引用导致内存泄漏的,和block的使用类似。
@weakify(self);
[[_redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
@strongify(self);
NavViewController *navVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:NSStringFromClass([NavViewController class])];
[self.navigationController pushViewController:navVC animated:YES];
}];
RACTuplePack
把数据包装成RACTuple(元组类)
// 把参数中的数据包装成元组
RACTuple *tuple = RACTuplePack(@"Scott_Mr",@20);
RACTupleUnpack
把RACTuple(元组类)解包成对应的数据。
// 解包元组,会把元组的值,按顺序给参数里面的变量赋值
// name = @"Scott_Mr" age = @20
RACTupleUnpack(NSString *name,NSNumber *age) = tuple;
NSLog(@"%@,%@",name,age);
声明
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan
ReactiveCocoa(二)的更多相关文章
- [iOS] 响应式编程开发-ReactiveCocoa(二)
RAC实现图片下载功能 在实现异步RAC下载图片的过程中,需要注意以下几点: • 通过 NSURLConnection 对象的 +(RACSignal *)rac_sendAsynchronousRe ...
- iOS开发之OC篇-响应式编程Reactive Cocoa
一.Reactive Cocoa 介绍 Reactive Cocoa 是 iOS 开发的一个 "重量级" 框架 高大上的概念:响应式编程 核心概念:信号 Signal 官方网站:h ...
- ReactiveCocoa源码解读(二)
上一篇解读了ReactiveCocoa的三个重要的类的底层实现,本篇继续. 一.RACMulticastConnection 1.应用 RACMulticastConnection: 用于当一个信号被 ...
- ReactiveCocoa应用篇(二)
上一篇介绍了ReactiveCocoa的常用类,已经基本满足项目中的简单应用要求,但是针对复杂的功能还需要其它的类来协同处理.ReactiveCocoa提供了强大的流程处理功能来解决复杂的问题,包括事 ...
- RAC(ReactiveCocoa)使用方法(二)
RAC(ReactiveCocoa)使用方法(一) RAC(ReactiveCocoa)使用方法(二) 上篇文章:RAC(ReactiveCocoa)使用方法(一) 中主要介绍了一些RAC中常见类的用 ...
- iOS开发ReactiveCocoa学习笔记(二)
RAC 中常见的宏: 使用宏定义要单独导入 #import <RACEXTScope.h> 一. RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用于给某个对象的某 ...
- ReactiveCocoa源码拆分解析(二)
(整个关于ReactiveCocoa的代码工程可以在https://github.com/qianhongqiang/QHQReactive下载) 上面抽丝剥茧的把最主要的信号机制给分离开了.但在RA ...
- ReactiveCocoa源码解析(二) Bag容器的代码实现
今天博客我接着上篇博客的内容来,上篇博客我们详细的看了ReactiveSwift中的Observer已经Event的代码实现.接下来我们来看一下ReactiveSwift中的结构体Bag的实现.Bag ...
- iOS开发之ReactiveCocoa下的MVVM(干货分享)
最近工作比较忙,但还是出来更新博客了,今天给大家分享一些ReactiveCocoa以及MVVM的一些东西,干活还是比较足的.在之前发表过一篇博文,名字叫做<iOS开发之浅谈MVVM的架构设计与团 ...
随机推荐
- swift中的正则表达式
swift中的t正则表达式 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串" ...
- JavaScript中最常用的55个经典技巧,没事的时候看看,拓展解决问题的思路
都转烂了,不过还是贴上来了.查的时候方便... test 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 & ...
- pom中的resources设置
Maven项目中一般都会把配置文件放到src/main/resources目录下,有时为了满足多个环境打包发布,可能会创建一些自定义目录来放置各环境的配置文件,如:src/main/profile/d ...
- 聊聊、Spring ServletContainerInitializer
我们平时用 Java 注解很多,例如 @Configuration.@Component.@Service,我们习惯于通过 XML 方式来实现 Web,而用 Java 注解方式来实现 Web 却很少. ...
- nyoj 题目36 最长公共子序列
最长公共子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...
- 【bzoj5017】[Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
题目描述 在一条直线上有 N 个炸弹,每个炸弹的坐标是 Xi,爆炸半径是 Ri,当一个炸弹爆炸时,如果另一个炸弹所在位置 Xj 满足: Xi−Ri≤Xj≤Xi+Ri,那么,该炸弹也会被引爆. 现在 ...
- [bzoj4361] isn [树状数组+dp+容斥原理]
题面 传送门 思路 首先,本题目的核心元素是非降子序列,而显然这个题目中的子序列只和序列的长度.位置,以及互相之间的包含关系,这些东西相关 所以我们可以依据这些先"猜"(实际上是估 ...
- 262144 (game)
262144 (game) 题目描述 Bessie likes downloading games to play on her cell phone, even though she does fi ...
- eclipse快捷键及各种设置
1.提示键配置一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项 ...
- POJ3585:Accumulation Degree(换根树形dp)
Accumulation Degree Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3425 Accepted: 85 ...