RAC系列(1)基础认知

281 阅读1分钟

项目中使用RAC的好处:

  1. 属性提示方便
  2. 代码巨简洁
  3. 代码逻辑和功能逻辑相比KVO,更加聚合,可读性高

适合单独开发,效率高,而且爽;

不太适合团队开发,学习成本高,有可能有些同学看不懂,增加沟通成本。

1. RAC框架结构

Pasted Graphic 1.png

2. 信号生命周期

Pasted Graphic 3.png

// 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. 信号流程分析

万物皆信号 Pasted Graphic 4.png

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]);
}];