RAC初体验

1. 什么是 ReactiveCocoa

ReactiveCocoa(其简称为 RAC)是由 Github 开源的一个应用于 iOS 和 OS X 开发的新框架。RAC 具有函数式编程和响应式编程的特性。它主要吸取了 .Net 的 Reactive Extensions 的设计和实现。

2. ReactiveCocoa 试图解决什么问题

  1. 传统 iOS 开发过程中,状态以及状态之间依赖过多的问题
  2. 传统 MVC 架构的问题:Controller 比较复杂,可测试性差
  3. 提供统一的消息传递机制

3. ReactiveCocoa编程思想

ReactiveCocoa结合了几种编程风格:

函数式编程(Functional Programming)

响应式编程(Reactive Programming)

所以,你可能听说过ReactiveCocoa被描述为函数响应式编程(FRP)框架。

以后使用RAC解决问题,就不需要考虑调用顺序,直接考虑结果,把每一次操作都写成一系列嵌套的方法中,使代码高聚合,方便管理。


RAC初体验_第1张图片
RAC常用
- (void)testTmer{

    [[RACSignal interval:1 onScheduler:[RACScheduler schedulerWithPriority:(RACSchedulerPriorityHigh) name:@" com.ReactiveCocoa.RACScheduler.mainThreadScheduler"]] subscribeNext:^(NSDate * _Nullable x) {
        NSLog(@"%@",[NSThread currentThread]);
    }];
}

- (void)testSequence{
    //数组
    NSArray *array = @[@"Cooci",@"123",@"18"];
    
    [array.rac_sequence.signal subscribeNext:^(id  _Nullable x) {
       
        NSLog(@"%@",x);
    }];
    
    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]);            
    }];       
}

- (void)testUI{
    
    //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.label.userInteractionEnabled = YES;
    [self.label addGestureRecognizer:tap];

    [tap.rac_gestureSignal subscribeNext:^(__kindof UIGestureRecognizer * _Nullable x) {

        NSLog(@"%@",x);
    }];

    
}

- (void)testNoti{
    
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
       
        NSLog(@"%@",x);
    }];
}


- (void)testDelegate{
    
    [[self rac_signalForSelector:@selector(textFieldDidBeginEditing:) fromProtocol:@protocol(UITextFieldDelegate)] subscribeNext:^(RACTuple * _Nullable x) {
        
        NSLog(@"%@",x);
    }];
    
    self.textField.delegate = self;
}


- (void)testKVO{
    
    [RACObserve(self, name) subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
    }];
    
    self.name = @"Cooci";
}



- (void)testBase{
    
    //1:创建信号
    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id  _Nonnull subscriber) {
       
        //subscriber 对象不是一个对象
        //3:发送信号
        [subscriber sendNext:@"Cooci"];
        
        //请求网络 失败 error
        NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:10086 userInfo:@{@"key":@"10086错误"}];
        
        [subscriber sendError:error];
//        [subscriber sendCompleted];
        
        //RACDisposable 销毁
        
        return [RACDisposable disposableWithBlock:^{
           
            NSLog(@"销毁了");
        }];
    }];
    
    
    //2:订阅信号
    [signal subscribeNext:^(id  _Nullable x) {
       
        NSLog(@"%@",x);
    }];
    //订阅错误信号
    [signal subscribeError:^(NSError * _Nullable error) {
        NSLog(@"%@",error);
    }];
}

你可能感兴趣的:(RAC初体验)