ReactiveCocoa个人记录
参考资料:
ReactiveCocoa源码(OC版)
Swift 版 or ReactiveSwift
MVVMReactiveCocoaDemo介绍
常见用法
1. rac_signalForControlEvents监听事件,替换addTarget监听
[[self.myButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {@strongify(self);//改变属性 触发KVOself.userModel.userName=@"cnblogs";//发送通知 触发通知监听[[NSNotificationCenter defaultCenter] postNotificationName:MPTNotificationName object:nil];NSLog(@"rac_signalForControlEvents监听事件 - ");}];
复制代码
2. rac_textSignal 监听文本框的文字改变
[[self.myTextField rac_textSignal] subscribeNext:^(id x) {NSLog(@"rac_textSignal当前输入:%@",x);}];//distinctUntilChanged 相同就不会再响应 takeUntil:(RACSignal *):获取信号直到某个信号执行完成[[[[self.myTextField rac_textSignal] distinctUntilChanged] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {NSLog(@"rac_textSignal-distinctUntilChanged当前输入:%@",x);}];
复制代码
3. rac_valuesAndChangesForKeyPath KVO监听
[[self.userModel rac_valuesAndChangesForKeyPath:@"userName"
options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {NSLog(@"userName now value:%@",x[0]);}];
复制代码
4. 监听通知
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:MPTNotificationName object:nil] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {NSLog(@"收到通知了");}];
复制代码
5. 替换代理方法的实现 rac_signalForSelector
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"RAC" message:@"RAC TEST" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other", nil];[[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple *tuple) {NSLog(@"tuple.first:%@",tuple.first);NSLog(@"tuple.second:%@",tuple.second);NSLog(@"tuple.third:%@",tuple.third);//tuple.first UIAlertView当前对象//tuple.second索引值}];[alertView show];// [[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:)] subscribeNext:^(id x) {
//
// }];//UIAlertView 还有更简便的 上面只是为了演示rac_signalForSelector 下面的X就是索引值//如果使用此方法rac_signalForSelector 不会再执行了。因为rac_buttonClickedSignal内部已经订阅了rac_signalForSelector方法[[alertView rac_buttonClickedSignal] subscribeNext:^(id x) {NSLog(@"index %@",x);}];
复制代码
6. 处理多个请求,都返回结果的时候,统一做处理.
rac_liftSelectorRACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {// 发送请求1[subscriber sendNext:@"发送请求1"];return nil;}];RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {// 发送请求2[subscriber sendNext:@"发送请求2"];return nil;}];// 使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];复制代码
更新UI
- (void)updateUIWithR1:(id)data r2:(id)data1
{NSLog(@"更新UI%@ %@",data,data1);
}
复制代码
队列
//then用法//用于连接两个信号,当第一个信号完成,才会连接then返回的信号RACSignal *thenSignal=[aSignal then:^RACSignal *{return bSignal;}];[thenSignal subscribeNext:^(id x) {NSLog(@"thenSignal的值:%@",x);}];//输出 thenSignal的值:7 thenSignal的值:9 bSignal清理了 aSignal清理了//then实例[[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {NSLog(@"第一步");[subscriber sendCompleted];//向订阅者发送完成信号,否者一直处于执行中return nil;}] then:^RACSignal *{return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {NSLog(@"第二步");[subscriber sendCompleted];return nil;}];}] then:^RACSignal *{return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {NSLog(@"第三步");[subscriber sendCompleted];return nil;}];}] subscribeCompleted:^{NSLog(@"完成");}];//输出:第一步 第二步 第三步//说明:then的用法要跟上面这样使用,它会在RACSignal里面就执行
复制代码
- doNext doCompleted执行时间 doNext: 执行Next之前,会先执行这个Block doCompleted: 执行sendCompleted之前,会先执行这个Block
[[[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {[subscriber sendNext:@"执行sendNext"];NSLog(@"执行sendNext");[subscriber sendCompleted];return nil;}] doNext:^(id x) {NSLog(@"执行doNext");}] doCompleted:^{NSLog(@"执行doCompleted");}] subscribeNext:^(id x) {NSLog(@"执行subscribeNext");
}];// 输出
// 执行doNext
// 执行subscribeNext
// 执行sendNext
// 执行doCompleted复制代码
ReactiveCocoa个人记录相关推荐
- ReactiveCocoa代码实践之-更多思考
三.ReactiveCocoa代码实践之-更多思考 1. RACObserve()宏形参写法的区别 之前写代码考虑过 RACObserve(self.timeLabel , text) 和 RACOb ...
- 从 ReactiveCocoa 中能学到什么?不用此库也能学以致用
从知道ReactiveCocoa开始就发现对这个库有不同的声音,上次参加<T>技术沙龙时唐巧对在项目中已全面使用FRP的代码家提出为什么这种编程模型出现了这么长时间怎么像ReactiveC ...
- iOS、Mac开源项目记录 - From TimLiu-iOS
本篇博文并非本人整理,是从下面大神的Github下载,为了方便自己查看所以发布到这里.感谢大神整理. 来自:https://github.com/huang5556019/huang5556019.g ...
- ReactiveCocoa Documents 翻译(基于版本V2.5)
1. 基本操作(Basic Operators) 描述 ReactiveCocoa 最常用的一些操作以及使用范例. 主要是如何运用 序列(sequences) 和 信号(signals) 的流操作. ...
- 知识点归档,博客记录
由于本人能力有限,难免有错,欢迎批评.指正.补充,目录请看右下角 Foundation复习 利用category + runtime + 异常的捕获 来写一个防止崩溃的框架 扩展(Extension) ...
- mysql建立联合索引,mysql建立唯一键,mysql如何解决重复记录联合索引
在项目中,常常要用到联合唯一 在一些配置表中,一些列的组合成为一条记录. 比如,在游戏中,游戏的分区和用户id会形成一条记录.(比如,一个qq用户可以在艾欧尼亚.德玛西亚创建两个账号) 添加联 ...
- 实现 连续15签到记录_MySQL和Redis实现用户签到,你喜欢怎么实现?
现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到排行榜 微博签到 如移动app ,签到送流量等活动, 移动app签到 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面 ...
- 记录一次http请求失败的问题分析
问题背景 当前我有一个基于Flask编写的Restful服务,由于业务的需求,我需要将该服务打包成docker 镜像进行离线部署,原始服务的端口是在6661端口进行开启,为了区分,在docker中启动 ...
- Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)
Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...
最新文章
- FreeBSD下查看各软件版本命令
- linux添加审计账户_眼镜蛇W眼镜蛇白盒品白源代码审计工具 白帽子版
- day06:02oracle体系结构_存储结构
- LaTex 各种特殊符号
- MySQL之单表查询、多表查询(一)
- HTML5语言格式,HTML5 自然语言格式的输入表单
- python3学习笔记(4)_function-参数
- 【LeetCode】64. Minimum Path Sum
- idea全局主题_2020年最新-IDEA最详细配置(配图文收藏版配置)
- 【算法笔记】最短路-Dijkstra、Floyd、SPFA模版总结+复习
- 17.20. 连续中值 堆
- python windows api截图_Winapi快速截图并打开
- 关于论文可查阅的网站
- python的encode方法_Python encode() 方法
- (2020李宏毅)机器学习-Explainable Machine Learning
- golang和经济学相关资料学习,还不错,果然B站是个学习的好地方。
- Origin坐标轴上的连字符修改为负号
- 2008年8月7号,晴,热了。一寸光阴一寸金,寸金难买寸光阴。——《增广贤文》
- win7电脑怎么连接打印机的方法分享
- 数据库课程设计-宿舍管理系统