ReactiveCocoa简单使用

一个非常好用的框架,大大减少代码量

1.引入ReactiveCocoa框架

个人习惯用cocoapods导入

use_frameworks!


target '项目名称'do

  

  pod 'ReactiveCocoa', '~> 7.0.0-alpha.1'

end

由于oc项目导入swift框架必须加入  use_frameworks!
使用了use_frameworks! 则cocoapods 会生成相应的 .frameworks文件(动态链接库:实际内容为 Header + 动态链接库 + 资源文件),使用 dynamic frameworks 来取代 static libraries 方式。

2.ReactiveCocoa常见类

学习框架首要之处:个人认为先要搞清楚框架中常用的类,在RAC中最核心的类RACSiganl,搞定这个类就能用ReactiveCocoa开发了。


2.1// RACSignal使用步骤:

    // 1.创建信号 + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe

    // 2.发送信号 - (void)sendNext:(id)value

    // 3.订阅信号,才会激活信号. - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock

// 1.创建信号

    RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {


        // block调用时刻:每当有订阅者订阅信号,就会调用block。


        // 2.发送信号

        [subscriber sendNext:@"消息"];


    }];

// 3.订阅信号,才会激活信号.

    [siganl subscribeNext:^(id x) {

        // block调用时刻:每当有信号发出数据,就会调用block.

        NSLog(@"接收到数据:%@",x);//接收到的消息

    }];



2.2

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

使用场景:通常用来代替代理,有了它,就不必要定义代理了。

// 1.创建信号

    RACSubject *subject = [RACSubject subject];


    // 2.订阅信号

    [subject subscribeNext:^(id x) {

        // block调用时刻:当信号发出新值,就会调用.

        NSLog(@"第一个订阅者%@",x);

    }];

    [subject subscribeNext:^(id x) {

        // block调用时刻:当信号发出新值,就会调用.

        NSLog(@"第二个订阅者%@",x);

    }];


    // 3.发送信号

    [subject sendNext:@"1"];


// 需求:

// 1.给当前控制器添加一个按钮,modal到另一个控制器界面

// 2.另一个控制器view中有个按钮,点击按钮,通知当前控制器

步骤一:在第二个控制器.h,添加一个RACSubject代替代理。

@interface TwoViewController : UIViewController


@property (nonatomic, strong) RACSubject *delegateSignal;


@end


步骤二:监听第二个控制器按钮点击

@implementation TwoViewController

- (IBAction)notice:(id)sender {

    // 通知第一个控制器,告诉它,按钮被点了


     // 通知代理

     // 判断代理信号是否有值

    if (self.delegateSignal) {

        // 有值,才需要通知

        [self.delegateSignal sendNext:nil];

    }

}

@end


步骤三:在第一个控制器中,监听跳转按钮,给第二个控制器的代理信号赋值,并且监听.

@implementation OneViewController

- (IBAction)btnClick:(id)sender {


    // 创建第二个控制器

    TwoViewController *twoVc = [[TwoViewController alloc] init];


    // 设置代理信号

    twoVc.delegateSignal = [RACSubject subject];


    // 订阅代理信号

    [twoVc.delegateSignal subscribeNext:^(id x) {


        NSLog(@"点击了通知按钮");

    }];


    // 跳转到第二个控制器

    [self presentViewController:twoVc animated:YES completion:nil];


}

@end

2.3

RACTuple:元组类,类似NSArray,用来包装值.


// 1.遍历数组

    NSArray *numbers = @[@1,@2,@3,@4];


    // 这里其实是三步

    // 第一步: 把数组转换成集合RACSequence numbers.rac_sequence

    // 第二步: 把集合RACSequence转换RACSignal信号类,numbers.rac_sequence.signal

    // 第三步: 订阅信号,激活信号,会自动把集合中的所有值,遍历出来。

    [numbers.rac_sequence.signal subscribeNext:^(id x) {


        NSLog(@"%@",x);

    }];


RACSequence:RAC中的集合类,用于代替NSArray,NSDictionary,可以使用它来快速遍历数组和字典。


    // 2.遍历字典,遍历出来的键值对会包装成RACTuple(元组对象)

    NSDictionary *dict = @{@"name":@"xmg",@"age":@18};

    [dict.rac_sequence.signal subscribeNext:^(RACTuple *x) {


        // 解包元组,会把元组的值,按顺序给参数里面的变量赋值

        RACTupleUnpack(NSString *key,NSString *value) = x;


        // 相当于以下写法

//        NSString *key = x[0];

//        NSString *value = x[1];


        NSLog(@"%@ %@",key,value);


    }];

2.4

RACCommand:RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。


// 1.创建命令

    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {


        NSLog(@"执行命令");

        //创建信号,用来传递数据

        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {


      //请求数据

            [subscriber sendNext:@"请求数据"];


            // 注意:数据传递完,最好调用sendCompleted,这时命令才执行完毕。

            [subscriber sendCompleted];


            return nil;

        }];


    }];

// 强引用命令,不要被销毁,否则接收不到数据

    _conmmand = command;

 // 3.执行命令

    [self.conmmand execute:

@{@"url":@"https://ip/search",@"paras":@{@"one":@"1",@"two":@"2"}}

];


    // 4.订阅RACCommand中的信号

    [command.executionSignals subscribeNext:^(id x) {


        [x subscribeNext:^(id x) {


            NSLog(@"%@",x);

        }];


    }];




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值