原文地址:http://www.teehanlax.com/blog/getting-started-with-reactivecocoa/
在先前的文章中,介绍一了ReactiveCocoa概念,ReactiveCocoa是Objective-C中用于声明式编程的类库。接下来在这里会介绍一些ReactiveCocoa中的模式,讨论一些最佳实践,并指出一些常见的陷阱。ReactiveCocoa的学习需要时间,让我们慢慢来。
模式
在ReactiveCocoa中有三种基本的模式:责任链、分割和组合模式(chaining,splitting,and combining)。之前的文章时稍微介绍了责任链和组合模式,接下来的会更深入。
回顾一下:在ReactiveCocoa中的核心是signal:(信号),它表示不断变化的状态。当我们使用chain、split和combine时,实际上我们就是在操作这些signal。
Chaining是在ReactiveCocoa最常用的模式:将一个已有的signal转换为一个新的signal。常用的操作是创建一个新的signal,再对它使用filter:、map:或startWith:等方法。例:
- RAC(self.textField.text)=[[[RACSignalinterval:1]startWith:[NSDatedate]]map:^id(NSDate*value){
- NSDateComponents*dateComponents=[[NSCalendarcurrentCalendar]components:NSMinuteCalendarUnit|NSSecondCalendarUnitfromDate:value];
- return[NSStringstringWithFormat:@"%d:%02d",dateComponents.minute,dateComponents.second];
- }];
在这个例子中,我们将textFiled的text属性绑定为三个串连的signals的结果。首先,我们创建一个间隔信号,这个信号每隔一秒钟就发送当前时间。间隔信号在没有启动的时候是不会有值的,所以我们使用startWith:启动起来。最后,使用map:将signal的NSDate值转换为一个NSString字符串,这个字符串将会被赋值到textField的text属性上。
Chaining是最常用的操作,而且它通常不使用局部变量,而是像上面那样串连起来操作。下面的代码与上面的代码是等同的。