ReactiveCocoa 主要由以下四大核心组件构成:
信号源:RACStream 及其子类;
订阅者:RACSubscriber 的实现类及其子类;
调度器:RACScheduler 及其子类;
清洁工:RACDisposable 及其子类。
RACSignal
对于一个应用来说,绝大部分的时间都是在等待某些事件的发生或响应某些状态的变化,比如用户的触摸事件、应用进入后台、网络请求成功刷新界面等等,而维护这些状态的变化,常常会使代码变得非常复杂,难以扩展。而 ReactiveCocoa 给出了一种非常好的解决方案,它使用信号来代表这些异步事件,提供了一种统一的方式来处理所有异步的行为,包括代理方法、block 回调、target-action 机制、通知、KVO 等
//监听代理 Delegate
[[self rac_signalForSelector:@selector(tableView:didSelectRowAtIndexPath:) fromProtocol:@protocol(UITableViewDelegate)] subscribeNext:^(id x) {
}];
//监听属性 KVO
[[self.textFiled rac_valuesForKeyPath:@"textColor" observer:self] subscribeNext:^(id x) {
NSLog(@"hasChangedColor");
}];
//(RAC宏)
RAC(self.textFiled,textColor) = [self.textFiled.rac_textSignal map:^id(NSString *value) {
return value.length>5 ? [UIColor grayColor] : [UIColor blackColor];
}];
//监听通知 Notification
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:AVAudioSessionRouteChangeNotification object:nil] subscribeNext:^(id x) {
}];
//按钮点击事件 UIControlEvents
[[self.loginBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"rac_signalForControlEvents");
}];
//绑定
RAC(self,userName) = [self.textFiled.rac_textSignal map:^id(NSString *value) {
return value;
}];
//多重绑定
RAC(self.loginBtn,enabled) = [RACSignal combineLatest:@[self.textFiled.rac_textSignal,self.passwordFiled.rac_textSignal] reduce:^id(NSString *account,NSString *password){
return @(([account rangeOfString:@"@"].location != NSNotFound)&&(password.length>=6));
}];
RACSequence
RACSequence 代表的是一个不可变的值的序列,与 RACSignal 不同,它是 pull-driven 类型的流。从严格意义上讲,RACSequence 并不能算作是信号源,因为它并不能像 RACSignal 那样,可以被订阅者订阅,但是它与 RACSignal 之间可以非常方便地进行转换。
NSArray *strArr = @[@"12312",@"1782312",@"12",@"872462",@"8924632",@"1721@",@"98234@",@"@983845u",@"@92348",@"23@23984"];
NSArray *filtArray = [[[strArr.rac_sequence filter:^BOOL(NSString *value) {
return [value hasPrefix:@"1"];
}] map:^id(NSString *value) {
return [value stringByAppendingString:@"好"];
}] array];