#### ReactiveCocoa 是什么?
ReactiveCocoa 由 Github的工程师们开发,统一了 Native APP 中事件的等待和响应。
#### 基本概念:RACSignal
ReactiveCocoa 通过对信号(Signal)的订阅(subscribe)、用 Block 来处理事件的等待和响应。信号即被订阅的对象,描述了我们关注的状态的变化。
#### RACSignal 的常用操作与示例
1、-subscribeNext:订阅下一个信号,信号被订阅后才能起作用。
2、-map:映射,信号使用前的预处理。
3、-filter:信号使用前的过滤。1
2
3
4
5
6
7
8
9[[[aRACSignal map:^id(id value) {
return xxx;
}]
filter:^BOOL(id value) {
return xxx;
}]
subscribeNext:^(id x) {
}];
4、+combineLatest:reduce:通过合并与归纳生成一个信号。1
2
3[RACSignal combineLatest:@[stringSignal, intSignal] reduce:^(NSString *string, NSNumber *number) {
return [NSString stringWithFormat:@"%@: %@", string, number];
}];
5、-logAll:调试时打印日志方法。1
[aRACSignal logAll];
#### 常见的 RACSignal 及其示例
1、Notification:1
[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"notificationName" object:nil]
2、KVO:1
RACObserve(self, arrayController.items)
3、selector1
[view rac_signalForSelector:@selector(someMethod:)]
4、UIActionSheet、UIAlertView1
[view rac_buttonClickedSignal]
5、UIBarButtonItem、UIButton1
2 self.xxxButton.rac_command = [[RACCommand alloc] initWithEnabled:enableSignal signalBlock:^RACSignal *(id input) {
}];
6、UIControl1
[aUIControl rac_signalForControlEvents:UIControlEventEditingChanged]
7、UIGestureRecognizer1
2UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] init];
[tapGesture rac_gestureSignal];
8、UITextField、UITextView1
aTextField.rac_textSignal
#### Block 的内存管理
主要通过 @weakify(self) 和 @strongify(self) 来避免引用循环,示例如下:1
2
3
4
5
6@weakify(self);
self.xxxButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
@strongify(self);
[self someMethod]; // 此处直接使用 self 指针
return [RACSignal empty];
}];
#### 总结:
ReactiveCocoa 用 Block 来处理各种状态的变化实在是方便的很,遗憾的是这不是苹果原生的,所以有学习成本。不建议深度使用,以免学习和维护成本过高。简单用法就是先找到一个 RACSignal,然后对其进行常用操作即可。