ReactiveCocoa是github去年开源的一个项目,是在iOS平台上对FRP的实现。FRP的核心是信号,信号在ReactiveCocoa(如下简称RAC)中是经过RACSignal来表示的,信号是数据流,能够被绑定和传递。 能够把信号想象成水龙头,只不过里面不是水,而是玻璃球(value),直径跟水管的内径同样,这样就能保证玻璃球是依次排列,不会出现并排的状况(数据都是线性处理的,不会出现并发状况)。水龙头的开关默认是关的,除非有了接收方(subscriber),才会打开。这样只要有新的玻璃球进来,就会自动传送给接收方。能够在水龙头上加一个过滤嘴(filter),不符合的不让经过,也能够加一个改动装置,把球改变成符合本身的需求(map)。也能够把多个水龙头合并成一个新的水龙头(combineLatest:reduce:),这样只要其中的一个水龙头有玻璃球出来,这个新合并的水龙头就会获得这个球。
[self.input.rac_textSignal subscribeNext:^(id x){ NSLog(@"%@", x); }];
在这段代码之后,只要你的TextField中的值有变化。均可以打印出来。实现了KVO的功能却减小了无数的代码。体现了绑定和响应。git
在这段代码的基础上咱们还能够进行过滤 , 如下是第二个例子:github
[[self.input.rac_textSignal filter:^BOOL(id value){ NSString*text = value; return text.length > 3; }] subscribeNext:^(id x){ NSLog(@"%@", x); }];
编译运行,在TextField只能输入字符,你会发现只有当输入超过3个字符时才会有打印输出。并发
RACSignal的每一个操做都会返回一个RACsignal,这在术语上叫作连贯接口(fluent interface)。这个功能可让你直接构建管道,而不用每一步都使用本地变量。学习
在上面的代码中,注释部分标记了将id隐式转换为NSString,这看起来不是很好看。幸运的是,传入block的值确定是个NSString,因此你能够直接修改参数类型:code
[[self.input.rac_textSignal filter:^BOOL(NSString*text){ return text.length > 3; }] subscribeNext:^(id x){ NSLog(@"%@", x); }];
第一个例子是简单的全部变化都会响应到。可是需求可能只须要响应部分状况。这时候就用filter来过滤。filter的block返回YES的状况就是须要触发的状况。其余就不返回。blog
这个是用的leezhong的图接口
验证每一个所填写的数值符合标准以后,Button才能点击。input
RAC(self, self.btn.enabled) = [RACSignal combineLatest:@[self.usernameText.rac_textSignal, self.passwordText.rac_textSignal] reduce:^id (NSString *userName, NSString *password) { return @(userName.length >= 6 && password.length >= 6); }];
这段代码把usernameText和passwordText的信号绑定在了一块儿作reduce处理之后, 返回一个BOOL值去跟self.btn.enabled进行绑定it
以上仅仅是ReactiveCocoa最简单的用法, 本身的理解也不是很深刻, 因此我会一直对ReactiveCocoa投入时间去学习和使用。编译
最后引用leezhong所说的一句话
RAC统一了对KVO、UI Event、Network request、Async work的处理,由于它们本质上都是值的变化(Values over time)。