项目中使用RAC的好处:
- 属性提示方便
- 代码巨简洁
- 代码逻辑和功能逻辑相比KVO,更加聚合,可读性高
适合单独开发,效率高,而且爽;
不太适合团队开发,学习成本高,有可能有些同学看不懂,增加沟通成本。
1. RAC框架结构
2. 信号生命周期
// RAC 流程分析
// 1: 信号产生
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 3:发送信号
[subscriber sendNext:@"Cooci"];
// 4:结束发送信号 - 调用之后发送 [RACDisposable disposable] 取消订阅信号
[subscriber sendCompleted];
// 5:销毁信号
// block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
// 执行完Block后,当前信号就不在被订阅了。
RACDisposable *disposable = [RACDisposable disposableWithBlock:^{
NSLog(@"开始销毁");
}];
return disposable;
}];
// 2: 订阅信号
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"订阅到了:%@",x);
}];
//订阅错误信号
[signal subscribeError:^(NSError * _Nullable error) {
NSLog(@"%@",error);
}];
3. 信号流程分析
万物皆信号
4. 初级用法
4.1 KVO
[RACObserve(self, name) subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
self.name = @"Helios";
4.2 通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@",x);
}];
4.3 代理
[[self rac_signalForSelector:@selector(textFieldDidBeginEditing:) fromProtocol:@protocol(UITextFieldDelegate)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"%@",x);
}];
self.textField.delegate = self;
4.4 UI
//Button
[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);
}];
self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id _Nullable input) {
NSLog(@"%@",input);
return [RACSignal empty];
}];
//textField
[self.textField.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@",x);
}];
//UITapGestureRecognizer
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
[self.view addGestureRecognizer:tap];
[tap.rac_gestureSignal subscribeNext:^(__kindof UIGestureRecognizer * _Nullable x) {
NSLog(@"%@",x);
}];
4.5 Timer
[[RACSignal interval:1 onScheduler:[RACScheduler schedulerWithPriority:(RACSchedulerPriorityHigh) name:@" com.ReactiveCocoa.RACScheduler.mainThreadScheduler"]] subscribeNext:^(NSDate * _Nullable x) {
NSLog(@"%@",[NSThread currentThread]);
}];
4.6 元组
//NSArray
//遍历 返回 NSString 类型
NSArray *array = @[@"Cooci",@"123",@"18"];
[array.rac_sequence.signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
//NSDictionary
NSDictionary *dict = @{@"key":@"Cooci",@"age":@"18",@"gender":@"1"};
[dict.rac_sequence.signal subscribeNext:^(id _Nullable x) {
//元祖
NSLog(@"%@",x);
RACTwoTuple *tuple = (RACTwoTuple *)x;
NSLog(@"key == %@ , value = %@",tuple[0],tuple[1]);
}];