1.ReactiveCocoa(函数响应式编程 FRP)
1.面向过程
2 面向对象:万物皆对象
3.链式编程
4.响应式编程:(Reactive Programming)万物皆是流(KVO应用)
5.函数式编程 (Function Programming)
BeeFramework 与ReactiveCocoa 类似的一款响应式开发库
[[self.phoneTextfield.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
NSString *str = value;
if ([Public isValidateMobile:str]) {
return YES;
}else{
self.loginButton.alpha = 0.5;
self.phoneTextfield.textColor = kRed_BtnBg;
return NO;
}
}] subscribeNext:^(NSString * _Nullable x) {
self.loginButton.alpha = 1;
self.phoneTextfield.textColor = kWhite;
}];
2.聚合信号:
目前在应用中,登录按钮只有当用户名和密码输入框的输入都有效时才工作。现在要把这里改成响应式的。
现在的代码中已经有可以产生用户名和密码输入框是否有效的信号了——validUsernameSignal和validPasswordSignal了。现在需要做的就是聚合这两个信号来决定登录按钮是否可用。
RACSignal *signUpActiveSignal =
[RACSignal combineLatest:@[validUsernameSignal, validPasswordSignal]
reduce:^id(NSNumber*usernameValid, NSNumber *passwordValid){
return @([usernameValid boolValue]&&[passwordValid boolValue]);
}];
注意:RACsignal的这个方法可以聚合任意数量的信号,reduce block的参数和每个源信号相关。ReactiveCocoa有一个工具类RACBlockTrampoline,它在内部处理reduce block的可变参数。实际上在ReactiveCocoa的实现中有很多隐藏的技巧,值得你去看看。
3.常用
分割——信号可以有很多subscriber,也就是作为很多后续步骤的源。注意上图中那个用来表示用户名和密码有效性的布尔信号,它被分割成多个,用于不同的地方。
聚合——多个信号可以聚合成一个新的信号,在上面的例子中,两个布尔信号聚合成了一个。实际上你可以聚合并产生任何类型的信号。