iOS上的ReactiveCocoa响应式编程

来源:互联网 发布:mac怎么重命名文件夹 编辑:程序博客网 时间:2024/04/27 13:59

注:这是稍微面向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的:


[self.textField.rac_textSignal subscribeNext:^(NSString*value) {    NSLog(@"Text field has been updated: %@", value);}];


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






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

 

[[self.textField.rac_textSignal filter:^BOOL(NSString*value) {    return [value length]>= 3;}] subscribeNext:^(NSString*value) {    NSLog(@"Text field has been updated: %@", value);}];


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


 

 

 

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


[[RACSignal   combineLatest:@[self.firstNameField.rac_textSignal, self.lastNameField.rac_textSignal]          reduce:^(NSString*firstName, NSString *lastName){              return @(firstName.length> 0 && lastName.length> 0);          }] 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