Reactive Cocoa介绍
Reactive Cocoa定义了标准的事件接口,因此可以使用一些基本的工具来更容易的连接、过滤和组合。Reactive Cocoa结合了函数式编程和响应式编程的特点:
- 函数式编程:将运算过程尽量写成一些列的函数调用。
- 响应式编程:面对离散数据流以及对离散数据流进行操作。
函数响应式编程:将输入转化为输出在时间上的持续过程的一种方式。
传统范式 VS Reactive Cocoa
这是一个例子:在用户登录界面,有2个输入框(帐号和密码)和一个登录按钮。限制条件:当用户输完帐号和密码、并且登录的网络请求还未发出时,确定按钮才可以点击。
传统范式:
- (BOOL)isFormValid {
return [self.usernameField.text length] > 0 &&
[self.emailField.text length] > 0 &&
[self.passwordField.text length] > 0 &&
[self.passwordField.text isEqual:self.passwordVerificationField.text];
}
#pragma mark - UITextFieldDelegate
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
self.createButton.enabled = [self isFormValid];
return YES;
}
Reactive Cocoa:
RACSignal *formValid = [RACSignal
combineLatest:@[
self.username.rac_textSignal,
self.emailField.rac_textSignal,
self.passwordField.rac_textSignal,
self.passwordVerificationField.rac_textSignal
]
reduce:^(NSString *username, NSString *email, NSString *password, NSString *passwordVerification) {
return @([username length] > 0 && [email length] > 0 && [password length] > 8 && [password isEqual:passwordVerification]);
}];
RAC(self.createButton.enabled) = formValid;
通过对比可以发现,在传统范式的例子中,逻辑被放在了很多方法里。而Reactive Cocoa中将判断表单输入是否合法的逻辑都整合为一串逻辑。
什么是Reactive Cocoa?
- Github for mac客户端的副产物。
- FRP在Cocoa框架下的实现。
- 包含了Cocoa框架的多种组件。
- 提供基于时间变化的数据流的组合和变换。
- 简称RAC。
冷信号 VS 热信号
冷热信号的概念来源于.NET框架的Reactive Extensions(RX)中的Hot Observable和Cold Observable
冷信号:
冷信号是被动的,只有当你订阅的时候,它才会发布消息。冷信号只能一对一,当有不同的订阅者,消息是重新完整发送的。
热信号:
热信号是主动的,尽管你没有订阅事件,但是它会时刻推送。就像鼠标移动。热信号可以有多个订阅者,是一对多的。
RAC中的核心组件
- RACSignal、RACSequence、RACStram
RACSignal和RACSequence都是streams,它们之间共享很多方法。RACSignal是push驱动的stream,
RACSequence是pull驱动的stream;
- RACSubscriber
- RACDisposable
- RACScheduler
- Cocoa框架适配工具
参考资料
1、https://www.raywenderlich.com/62699/reactivecocoa-tutorial-pt1
2、http://nshipster.cn/reactivecocoa/
3、http://tech.meituan.com/talk-about-reactivecocoas-cold-signal-and-hot-signal-part-1.html