iOS上的ReactiveCocoa响应式编程

注:这是稍微面向iOS开发者们的文章。

Objective-C是一门基于C的高级编程语言。然后随着计算机运算能力和高级编程语言艺术设计不断发展,Objective-C看起来有些过时了。


Objective-C和C是命令式编程语言,程序员得按计算机执行顺序写好一行行语句,产生的行为就是执行这些指令。如果开发者写的语句和顺序都没有错,那么产生的行为就应该能满足项目的需要。


然而,这种命令式的编程通常会有缺陷,一般我们会用手动或自动化测试来发现并减少这些问题。但有另外一种更好的方法,把这些指令都抽象出来,并将重心放在所需行为上,这就是声明式编程(declarative programming)。


命令式编程让开发者将重心放在如何(how)写程序来实现需求。而声明式编程让开发者将重心放在描述需求是什么(what)


接下来看些例子,看看在Objective-C中的声明式编程。


signal(信号)是ReactiveCocoa中的核心。一个signal代表着一系列事件(事件流stream)的一个事件(event)。Subscribing(订阅)是访问signal的接口。下面有个例子:


在iOS app中text field的text变化事件时,会相应地产生signal。ReactiveCocoa提供了UITextField的一个category,这个category里有函数:rac_textSignal就是用来获取text变化的signal的:


[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [self.textField.rac_textSignal subscribeNext:^(NSString*value) {  
  2.     NSLog(@"Text field has been updated: %@", value);  
  3. }];  


在上面的代码中,我们declared(声明)当text field的text变化时,就打印它的新的text值。只要textfield的signal发出一个信号,上面的block就会执行。如下图所示:






比较爽的就是这个signals能够进行各种组合。接下来我们修改一下上面的代码,对rac_textSignal返回的signal进行filter(过滤),过滤掉新的字符串的长度少于3的字符串,然后再打印,那么打印出来的新字符串的长度就都大于3了。

 

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [[self.textField.rac_textSignal filter:^BOOL(NSString*value) {  
  2.     return [value length]>= 3;  
  3. }] subscribeNext:^(NSString*value) {  
  4.     NSLog(@"Text field has been updated: %@", value);  
  5. }];  


filter:方法返回一个新的signal。当第一个signal发出一个event后,这个event的值会被传到filter的block中作为参数。如果这个block返回YES,那么filter:返回的signal就会发出一个event给subscribeNext:。示图如下:


 

 

 

当然还可以做更复杂的事情:将两个不用的text fields的signals combine(组合)起来,把它们的text值reduce(归为)一个boolean值,并将这个boolean与一个button的enabled属性绑在一起。


[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [[RACSignal  
  2.    combineLatest:@[self.firstNameField.rac_textSignalself.lastNameField.rac_textSignal]  
  3.           reduce:^(NSString*firstName, NSString *lastName){  
  4.               return @(firstName.length0 && lastName.length0);  
  5.           }] toProperty:@"enabled" onObject:self.button];  


 

这个button的enabled属性与两个text field的最新的signal绑在一起了。这个FRP的核心之一:deriving state(派生态)。





在上面的这些例子中的语句写在viewDidLoad方法中后,这些语句就会在应用运行时有效。上面实现的这些,不需要用delegate来实现,也不需要储存各种状态。明确地指出想要的行为,而不是隐含地判断。

 

FRP的功能远不止于此,有关ReactiveCocoa更具体的学习要花点时间。当然,这点时间是相当值得的。

 

计算机和软件开发总是在不断向更高级发展的,比如我们早就不用打孔卡和汇编语言了。我相信FRP是接下来的软件开发的高级层次。


原文地址:http://www.teehanlax.com/blog/reactivecocoa/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值