本文转载至 http://blog.csdn.net/dfqin/article/details/39164241

IOS ReactiveCocoa RAC 响应式编程 RACSignal

ReactiveCocoa是响应式编程(FRP)在IOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa# ;在网上看了几篇文章,感觉理论讲了很多,但是代码还是看不太懂,于是自己把它github文档上的一些使用的经典示例实现了一下,项目中有需要时可以直接搬过去用,用的熟练了再读源码也比较容易理解。

例1. 监听对象的成员变量变化,当成员变量值被改变时,触发做一些事情。

这种情况其实就是IOS KVO机制使用的场景,使用KVO实现,通常有三个步骤:1,给对象的成员变量添加监听;2,实现监听回调;3,取消监听;而通过RAC可以直接实现,RAC的回调是通过block实现的,类似于过程式编程,上下文也更容易理解一些。

场景:当前类有一个成员变量 NSString *input,当它的值被改变时,发送一个请求。

实现:

[objc] view plaincopy
  1. [RACObserve(self, input)
  2. subscribeNext:^(NSString* x){
  3. request(x);//发送一个请求
  4. }];

每次input值被修改时,就会调用此block,并且把修改后的值做为参数传进来。

场景:在上面场景中,当用户输入的值以2开头时,才发请求.

实现:

[objc] view plaincopy
  1. [[RACObserve(self, input)
  2. filter:^(NSString* value){
  3. if ([value hasPrefix:@"2"]) {
  4. return YES;
  5. } else {
  6. return NO;
  7. }
  8. }]
  9. subscribeNext:^(NSString* x){
  10. request(x);//发送一个请求
  11. }];

场景:上面场景是监听自己的成员变量,如果想监听UITextField输入值变化,框架也做了封装可以代替系统回调

实现:

[objc] view plaincopy
  1. [[self.priceInput.rac_textSignal
  2. filter:^(NSString *str) {
  3. if (str.integerValue > 20) {
  4. return YES;
  5. } else {
  6. return NO;
  7. }
  8. }]
  9. subscribeNext:^(NSString *str) {
  10. <span style="white-space:pre">    </span>request(x);//发送一个请求

}];
例2. 同时监听多个变量变化,当这些变量满足一定条件时,使button为可点击状态

场景:button监听 两个输入框有值和一个成员变量值,当输入框有输入且成员变量为真时,button为可点击状态

实现:

[objc] view plaincopy
  1. RAC(self.payButton,enabled) = [RACSignal
  2. combineLatest:@[self.priceInput.rac_textSignal,
  3. self.nameInput.rac_textSignal,
  4. RACObserve(self, isConnected)
  5. ]
  6. reduce:^(NSString *price, NSString *name, NSNumber *connect){
  7. return @(price.length > 0 && name.length > 0 && [connect boolValue]);
  8. }];

场景:满足上面条件时,直接发送请求

实现:

[objc] view plaincopy
  1. [[RACSignal
  2. combineLatest:@[self.priceInput.rac_textSignal,
  3. self.nameInput.rac_textSignal,
  4. RACObserve(self, isConnected)
  5. ]
  6. reduce:^(NSString *price, NSString *name, NSNumber *connect){
  7. return @(price.length > 0 && name.length > 0 && ![connect boolValue]);
  8. }]
  9. subscribeNext:^(NSNumber *res){
  10. if ([res boolValue]) {
  11. NSLog(@"XXXXX send request");
  12. }
  13. }];

例3. 类似于生成产-消费

场景:用户每次在TextField中输入一个字符,1秒内没有其它输入时,去发一个请求。TextField中字符改变触发事件已在例1中展示,这里实现一下它触法的方法,把1秒延时在此方法中实现。

实现:

[objc] view plaincopy
  1. - (void)showLoading {
  2. [self.loadingDispose dispose];//上次信号还没处理,取消它(距离上次生成还不到1秒)
  3. @weakify(self);
  4. self.loadingDispose = [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
  5. [subscriber sendCompleted];
  6. return nil;
  7. }] delay:1] //延时一秒
  8. subscribeCompleted:^{
  9. @strongify(self);
  10. doRequest();
  11. self.loadingDispose = nil;
  12. }];
  13. }

上面代码看起来挻费解,不过下面一段类似的代码拆开写的,会比较容易理解:

[objc] view plaincopy
  1. [self.loadingDispose dispose];
  2. RACSignal *loggingSignal = [RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {//BLOCK_1
  3. subscriptions++;
  4. [subscriber sendNext:@"mytest"];
  5. [subscriber sendCompleted];
  6. return nil;
  7. }];
  8. loggingSignal = [loggingSignal delay:10];
  9. self.loadingDispose = [loggingSignal subscribeNext:^(NSString* x){//BLOCK_2
  10. NSLog(@"%@",x);
  11. NSLog(@"subscription %u", subscriptions);
  12. }];
  13. self.loadingDispose = [loggingSignal subscribeCompleted:^{//BLOCK_3
  14. NSLog(@"subscription %u", subscriptions);
  15. }];

loggingSignal在每次被调用subscriibeNext:^(id x)或subscribeCompleted:^方法时(12行和17行),它创建进传进的参数block_1就会被触动发,而block_1中的sendNext:方法会调用subscriibeNext:^中对应的block_2, 而block_1中的sendCompleted会调用subscribeCompleted:中对应的block_3

转载于:https://www.cnblogs.com/Camier-myNiuer/p/4759119.html

IOS响应式编程框架ReactiveCocoa(RAC)使用示例相关推荐

  1. iOS 高大上函数响应式编程框架ReactiveCocoa学习笔记1 简介

    ReactiveCocoa函数响应式编程 一.简介 ReactiveCocoa(其简称为RAC)是函数响应式编程框架.RAC具有函数式编程和响应式编程的特性.它主要吸取了.Net的 Reactive ...

  2. 响应式编程框架ReactiveCocoa学习——框架概览

    这篇博客将会继续翻译RAC的官方文档Framework Overview. 主要是对RAC这和框架进行概览的介绍和学习.同时也可以参考我前面的两篇翻译<响应式编程框架ReactiveCocoa学 ...

  3. 响应式编程框架ReactiveCocoa介绍与入门

    ReactiveCocoa是Github团队开发的第三方函数式响应式编程框架,在目前市面上的很多iOS App都大量使用了这个框架.以下我简称这个框架为RAC.我下面会通过几篇博客来和大家一起学习这个 ...

  4. [iOS] 响应式编程开发-ReactiveCocoa(一)

    什么是响应式编程 响应式编程是一种面向数据流和变化传播的编程范式.这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播. 例如,在命令式编程环境中 ...

  5. 【Unity3D插件】UniRx(基于Unity的响应式编程框架)插件学习

    一.介绍UniRx插件 UniRx是一种基于Unity3D的响应式编程框架. UniRx就是Unity版本的Rx响应式扩展,响应式就是观察者和定时器,扩展指的是LINQ的操作符.Rx响应式扩展的特点就 ...

  6. 【Unity3D插件】UniRx(基于Unity的响应式编程框架)插件教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有 ...

  7. 关于java的响应式编程框架----SpringReactor

    关于Reactor的介绍 Reactor是Spring中的一个子项目是一个基于java的响应式编程框架,此框架是 Pivotal 公司(开发 Spring 等技术的公司)开发的,实现了 Reactiv ...

  8. RXJava2响应式编程框架设计三---Rxjava2背压、生命周期

    在上一次https://www.cnblogs.com/webor2006/p/12348890.html中已经完成了对RxJava2的整个线程切换原理的详细剖析了,这次继续来学习它其它比较重要的知识 ...

  9. 什么是响应式编程框架

    什么是响应式编程? 如果要直接理解,可能比较抽象,但我们可以引用百度百科的例子:例如:a = b + c; 这句代码将b+c的值赋给a,而之后如果b和c的值改变了不会影响到a,然而,对于响应式编程,之 ...

最新文章

  1. 【总结整理】JS的继承
  2. 一个学术 导航网站----科塔学术
  3. [Github]watch和star的区别
  4. 2020癌症大数据分析,哪些癌症最要命?
  5. oracle clob 次数,解决Oracle clob字段数据过大问题
  6. 网络、通信术语及概念
  7. language support图标在哪里?怎么消失了?
  8. angularjs中按回车事件_在AutoCAD中巧用空格键或回车键,制图效率高
  9. homebrew卡在:Updating Homebrew处
  10. 如何linux安装apache服务器,Linux中如何安装Apache服务器
  11. PostgreSQL 9.6 同步多副本 与 remote_apply事务同步级别 应用场景分析
  12. 打开多个Excel2010文档在同一个窗口中显示问题如何解决
  13. TCP and UDP
  14. ubuntu需要多大的固态硬盘_Ubuntu16.10 迁移到 SSD
  15. xxl-job架构源码解析
  16. 开源GIS平台实战项目的总结
  17. vijos 1540 月亮之眼 并查集
  18. pyftpdlib 创建ftpserver
  19. TCP协议的RST标志位
  20. 鸡与蛋问题(先有Class还是先有Object)

热门文章

  1. java linux urlencode_iOS urlEncode编码解码(非过时方法,已解决)
  2. 每天一个linux命令目录
  3. Spring事务原理,Java开发岗还不会这些问题
  4. python隐式调用方法_Python为什么不隐式实现self
  5. apns 服务器 php,PHP技术来查询APNs反馈服务器
  6. 网络推广外包——企业委托网络推广外包公司提高网站流量和访问量
  7. 网站优化之网站文章更新需注意哪些问题?
  8. 网站设计怎样让搜索引擎对其另眼相待?
  9. SEO网络优化三招教你高质量外链的技巧
  10. 优艾智合机器人科技_在全球最大工业机器人消费市场,优艾智合如何助力产业智能化?...