IOS响应式编程框架ReactiveCocoa(RAC)使用示例
ReactiveCocoa是响应式编程(FRP)在iOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# ;在网上看了几篇文章,感觉理论讲了很多,但是代码还是看不太懂,于是自己把它github文档上的一些使用的经典示例实现了一下,项目中有需要时可以直接搬过去用,用的熟练了再读源码也比较容易理解。
例1. 监听对象的成员变量变化,当成员变量值被改变时,触发做一些事情。
这种情况其实就是IOS KVO机制使用的场景,使用KVO实现,通常有三个步骤:1,给对象的成员变量添加监听;2,实现监听回调;3,取消监听;而通过RAC可以直接实现,RAC的回调是通过block实现的,类似于过程式编程,上下文也更容易理解一些。
场景:当前类有一个成员变量 NSString *input,当它的值被改变时,发送一个请求。
实现:
- [RACObserve(self, input)
- subscribeNext:^(NSString* x){
- request(x);//发送一个请求
- }];
每次input值被修改时,就会调用此block,并且把修改后的值做为参数传进来。
场景:在上面场景中,当用户输入的值以2开头时,才发请求.
实现:
- [[RACObserve(self, input)
- filter:^(NSString* value){
- if ([value hasPrefix:@"2"]) {
- return YES;
- } else {
- return NO;
- }
- }]
- subscribeNext:^(NSString* x){
- request(x);//发送一个请求
- }];
场景:上面场景是监听自己的成员变量,如果想监听UITextField输入值变化,框架也做了封装可以代替系统回调
实现:
- [[self.priceInput.rac_textSignal
- filter:^(NSString *str) {
- if (str.integerValue > 20) {
- return YES;
- } else {
- return NO;
- }
- }]
- subscribeNext:^(NSString *str) {
- <span style="white-space:pre"> </span>request(x);//发送一个请求
}];
例2. 同时监听多个变量变化,当这些变量满足一定条件时,使button为可点击状态
场景:button监听 两个输入框有值和一个成员变量值,当输入框有输入且成员变量为真时,button为可点击状态
实现:
- RAC(self.payButton,enabled) = [RACSignal
- combineLatest:@[self.priceInput.rac_textSignal,
- self.nameInput.rac_textSignal,
- RACObserve(self, isConnected)
- ]
- reduce:^(NSString *price, NSString *name, NSNumber *connect){
- return @(price.length > 0 && name.length > 0 && [connect boolValue]);
- }];
场景:满足上面条件时,直接发送请求
实现:
- [[RACSignal
- combineLatest:@[self.priceInput.rac_textSignal,
- self.nameInput.rac_textSignal,
- RACObserve(self, isConnected)
- ]
- reduce:^(NSString *price, NSString *name, NSNumber *connect){
- return @(price.length > 0 && name.length > 0 && ![connect boolValue]);
- }]
- subscribeNext:^(NSNumber *res){
- if ([res boolValue]) {
- NSLog(@"XXXXX send request");
- }
- }];
例3. 类似于生成产-消费
场景:用户每次在TextField中输入一个字符,1秒内没有其它输入时,去发一个请求。TextField中字符改变触发事件已在例1中展示,这里实现一下它触法的方法,把1秒延时在此方法中实现。
实现:
- - (void)showLoading {
- [self.loadingDispose dispose];//上次信号还没处理,取消它(距离上次生成还不到1秒)
- @weakify(self);
- self.loadingDispose = [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
- [subscriber sendCompleted];
- return nil;
- }] delay:1] //延时一秒
- subscribeCompleted:^{
- @strongify(self);
- doRequest();
- self.loadingDispose = nil;
- }];
- }
上面代码看起来挻费解,不过下面一段类似的代码拆开写的,会比较容易理解:
- [self.loadingDispose dispose];
- RACSignal *loggingSignal = [RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {//BLOCK_1
- subscriptions++;
- [subscriber sendNext:@"mytest"];
- [subscriber sendCompleted];
- return nil;
- }];
- loggingSignal = [loggingSignal delay:10];
- self.loadingDispose = [loggingSignal subscribeNext:^(NSString* x){//BLOCK_2
- NSLog(@"%@",x);
- NSLog(@"subscription %u", subscriptions);
- }];
- self.loadingDispose = [loggingSignal subscribeCompleted:^{//BLOCK_3
- NSLog(@"subscription %u", subscriptions);
- }];
loggingSignal在每次被调用subscriibeNext:^(id x)或subscribeCompleted:^方法时(12行和17行),它创建进传进的参数block_1就会被触动发,而block_1中的sendNext:方法会调用subscriibeNext:^中对应的block_2, 而block_1中的sendCompleted会调用subscribeCompleted:中对应的block_3
IOS响应式编程框架ReactiveCocoa(RAC)使用示例的更多相关文章
- IOS响应式编程框架ReactiveCocoa(RAC)使用示例-备
ReactiveCocoa是响应式编程(FRP)在IOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# :在网上看了几 ...
- iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好
转载: iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好 内容来自stack overflow的一个回答:ReactiveCocoa vs RxSwift – pros an ...
- [iOS] 响应式编程开发-ReactiveCocoa(一)
什么是响应式编程 响应式编程是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播. 例如,在命令式编程环境中 ...
- [iOS] 响应式编程开发-ReactiveCocoa(二)
RAC实现图片下载功能 在实现异步RAC下载图片的过程中,需要注意以下几点: • 通过 NSURLConnection 对象的 +(RACSignal *)rac_sendAsynchronousRe ...
- 响应式布局框架 Pure-CSS 5.0 示例中文版-上
0. Pure-CSS 介绍 Pure CSS 是雅虎出品的 CSS 框架, 依托于Normalize.CSS,在不适用任何JS代码情况下即可实现响应式布局的轻量级框架,无依赖,体积小. 1. CDN ...
- 响应式布局框架 Pure-CSS 5.0 示例中文版-中
8. 表单 Form 在 form 标签中添加 .pure-form 类,可生成单行表单(inline) 效果图: 代码: <form class="pure-form"&g ...
- 响应式布局框架 Pure-CSS 5.0 示例中文版-下
10. 表格 Tables 在 table 标签增加 .pure-table 类 <table class="pure-table"> <thead> &l ...
- ReactiveCocoa,最受欢迎的iOS函数响应式编程库(2.5版),没有之一!
简介 项目主页: ReactiveCocoa 实例下载: https://github.com/ios122/ios122 简评: 最受欢迎,最有价值的iOS响应式编程库,没有之一!iOS MVVM模 ...
- [转帖]浅谈响应式编程(Reactive Programming)
浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22 ...
随机推荐
- SQL Server 性能调优之--tempdb 之存放路径
在我们的OLAP的实现中,SQL超级复杂,用了很多的临时表,tempdb在安装时默认选择了安装SQLserver的本地磁盘路径,没有使用磁盘阵列. 在学习PostgreSQL时发现很多专家建议把临时表 ...
- TortoiseSVN的合并对比工具TortoiseMerge启动时很慢很卡的解决办法
用了新版本的TortoiseSVN,但是在进行文件版本对比或者是解决冲突的时候,每次都要等上好几秒钟,TortoiseMerge窗口才显示出来.在Visual Studio中使用这个作为SVN工具,也 ...
- C# 日期格式转【转】
使用:DateTime.ToString的方法(String, IFormatProvider)转换格式 using System; using System.Globalization; Strin ...
- Linux从零单排(二):setuptools、pip、anaconda2的环境配置
为了更方便的使用Python的类库,需要进行相应的配置 (一)setuptools的配置 1.setuptools的下载 命令行输入wget https://pypi.python.org/packa ...
- ios上position:fixed失效问题
手机端上的猫腻真是多啊~~~ 此起彼伏! 最近又遇到了 固定定位的底部导航在ios上被弹出去 此时内心1w+个草泥马奔过~~~~~~~~ 直接上解决方案: <div class="ma ...
- MySQL 插入数据 通过命令提示窗口插入数据
MySQL 表中使用 INSERT INTO SQL语句来插入数据. 你可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者通过PHP脚本来插入数据. 语法 以下为向MySQL数据表插 ...
- 获取ip ,百度地图坐标点 和 在 后台调用 url()
protected void getip() { string ips = HttpContext.Current.Request.UserHostA ...
- Renci.SshNet在Linux运维的应用
SSH.NET是一个.net的SSH应用库,支持并发.该库最新的代码可以从github上下载下来,比Sharp.SSH更新的频繁.它可以模拟ssh登陆,类似xshell.putty等工具.不过有更多的 ...
- Error:java:Compilation failed: internal java compiler error
在IDEA中编译时出现这个错误:Error:java:Compilation failed: internal java compiler error! Information:Using javac ...
- oracle not in,not exists,minus 数据量大的时候的性能问题
http://blog.csdn.net/greenappple/article/details/7073349/ 耗时 minus<not exists<not in