ReactiveCocoa 简单总结

####  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、selector

1
[view rac_signalForSelector:@selector(someMethod:)]

  4、UIActionSheet、UIAlertView

1
[view rac_buttonClickedSignal]

  5、UIBarButtonItem、UIButton

1
2
    self.xxxButton.rac_command = [[RACCommand alloc] initWithEnabled:enableSignal signalBlock:^RACSignal *(id input) { 
}];

  6、UIControl

1
[aUIControl rac_signalForControlEvents:UIControlEventEditingChanged]

  7、UIGestureRecognizer

1
2
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] init];
[tapGesture rac_gestureSignal];

  8、UITextField、UITextView

1
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,然后对其进行常用操作即可。

类库链接:https://github.com/ReactiveCocoa/ReactiveCocoa