美文网首页
RAC初体验

RAC初体验

作者: Cooci_和谐学习_不急不躁 | 来源:发表于2018-05-19 15:06 被阅读38次

    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常用
    - (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<RACSubscriber>  _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初体验

          本文链接:https://www.haomeiwen.com/subject/qhzodftx.html