ReactiveCocoa(RAC)简单入门

作者: 殇鑫 | 来源:发表于2017-03-30 11:50 被阅读101次

    ReactiveCocoa(RAC)是GitHub开源的一款Cocoa FRP(Functional Reactive Programming)框架。它完全可以代替传统的控件点击事件、代理、属性值变化(KVO)、网络请求等功能。话不多说下面我们就来认识一下这个框架吧。

    1、RAC简介

    ReactiveCocoa(RAC) 是由GitHub开源的一个应用于iOS和OS X开发的新框架。RAC具有函数式编程响应式编程的特性。它主要吸取了 .Net 的 Reactive Extensions 的设计和实现。RAC提供信号(由RACSignal代表)来捕获当前和将来的值而不是使用可变的变量。事件通过RACSignal发出,RACSignal会把它们推送给每个观察者。所有的观察者都会同时接受到事件。观察一个信号不会触发其他副作用。
    了解更多可以到这里查看:
    ReactiveCocoa 讨论会 - 唐巧的技术博客
    ReactiveCocoa框架组成介绍
    美团技术博客

    2、导入ReactiveCocoa框架

    一般我们都会使用CocoaPods导入。
    导入过程中注意一些细节

    • CocoaPods版本过低。
    • pod ReactiveCocoa上面添加 use_frameworks才能导入成功。
    • 忘记添加工程的target。
      正确姿势是这样子滴:
    platform :ios, '8.0'
    target 'Demo' do
    use_frameworks!
    pod 'ReactiveObjC'
    end
    

    oc : pod ‘ReactiveObjC’ swift : pod ‘ReactiveCocoa’
    导入成功后首先引入<ReactiveCocoa/ReactiveCocoa.h>

    3、ReactiveCocoa常用类和方法

    3.1 RACSignal 简单创建及使用

    RACSiganl: 信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。

        /**
         *    RACSignal使用步骤:
         1.创建信号,创建完成还不会触发.
         2.订阅信号,才会激活信号.
         3.发送信号 发送信息.
         */
        //1.创建信号.
        RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            //2.发送信号.
            [subscriber sendNext:@"这是我的订阅信息"];//发送信号
            [subscriber sendCompleted];//发送信号完成,
            
            return [RACDisposable disposableWithBlock:^{
                
                // block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。
                NSLog(@"信号被销毁");
                
            }];
        }];
        //3.订阅信号.
        [siganl subscribeNext:^(id x) {
    
            NSLog(@"接收到信号信息:%@",x);
        }];
    

    3.2 RACSubject简单创建及使用

    RACSubject:信号提供者,自己可以充当信号,又能发送信号。

        /**
         * // RACSubject使用步骤
          1.创建信号 跟RACSiganl不一样,创建信号时也没有触发.
          2.订阅信号
          3.发送信号
         */
        // 1.创建信号
        RACSubject *subject = [RACSubject subject];
        
        // 2.订阅信号
        [subject subscribeNext:^(id x) {
            // block调用时刻:当信号发出新值,就会调用.
            NSLog(@"接收信号信息%@",x);
        }];
        
        // 3.发送信号
        [subject sendNext:@"发送订阅信息"];
    

    3.3 代理的使用方法

        // 本次示例是由firstPageController 跳转到secondPageController
        //firstPageController 点击页面跳转事件
        secondPageController *second = [[secondPageController alloc] init];
        // 设置代理信号
        second.delegateSignal = [RACSubject subject];
    
        // 订阅代理信号
        [second.delegateSignal subscribeNext:^(id x) {
            NSLog(@"点击了通知按钮");
        }];
        // 跳转到 secondPageController
        [self.navigationController pushViewController: second animated:YES];
         //secondPageController.h 页面设置
         @property (nonatomic, strong) RACSubject *delegateSignal;
         //secondPageController.m 执行代理方法
         // 判断代理信号是否有值
         if (self.delegateSignal) {
         [self.delegateSignal sendNext:@"我是secondPage传来的值"];
         }
    

    3.4 通知的使用方法

        /**
         *  注册通知并监听
         */
        [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"notification" object:nil] subscribeNext:^(NSNotification*notification) {
            //收到nsnotification 通知
            NSLog(@"%@%@",notification.name,notification.object);
            
        }];
         /**
             发送通知
          */
           NSMutableArray *dataArray = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", nil];
          [[NSNotificationCenter defaultCenter] postNotificationName:@"notification" object:dataArray];
    

    3.5 代替控件事件的使用

    //这里只用UIButton的点击事件 和 UILabel的手势作为示例
        /**
           UIButton的点击事件
         */
        [[self.testButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
            
            //执行button的点击事件
            
        }];
        /**
          UILabel 手势
         */
     UITapGestureRecognizer *tap =[[UITapGestureRecognizer alloc] init];
        [[tap rac_gestureSignal] subscribeNext:^(id x) {
            
            //执行手势事件
            
        }];
        [self.testLabel addGestureRecognizer:tap];
    
    

    3.6 监听的使用方法

    //这里由UITextField作为示例
    [RACObserve(self.textField, text) subscribeNext:^(id x) {
            
            NSLog(@"%@",self.textField.text);
            
        }];
        
        [[self.textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x) {
            
            NSLog(@"change");
            
        }];
    

    3.7 遍历的使用方法RACTuple(元组对象)

        //遍历 NSArray
        NSArray *numbers = @[@"1",@"2",@"3",@"4"];
        [numbers.rac_sequence.signal subscribeNext:^(id x) {
            
            NSLog(@"%@",x);
        }];
        //遍历 NSDictionary
        NSDictionary *dict =@{@"name":@"小马",@"sex":@"男",@"age":@18};
        [dict.rac_sequence.signal subscribeNext:^(id x) {
            
            RACTupleUnpack(NSString *key,NSString*value) = x;
            
            NSLog(@"key=%@ value=%@",key,value);
            
        }];
    

    4、总结

    初学 ReactiveCocoa 参考各位大神的文章写了这篇简单易于实用的文章,ReactiveCocoa内容很多,这里展示的只是一点皮毛而已。这篇文章只是自己的知道的一些小的知识点有什么描述不对的地方还望大神指出。共同进步、共同学习。

    5、参考文献

    http://blog.leichunfeng.com/blog/2015/12/25/reactivecocoa-v2-dot-5-yuan-ma-jie-xi-zhi-jia-gou-zong-lan/
    http://www.jianshu.com/p/87ef6720a096

    相关文章

      网友评论

        本文标题:ReactiveCocoa(RAC)简单入门

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