ios之ReactiveCocoa框架的学习1

以下是几种简单的用法:(导入reactivecocoa框架的时候注意,只使用oc语言导入2.5版本以前,包括2.5版本,使用swift需要导入2.5版本以后)

//
//  ViewController.m
//  RAC05
//
//  Created by mac on 2018/5/2.
//  Copyright © 2018年 Gooou. All rights reserved.
//

#import "ViewController.h"
@import ReactiveCocoa;
@interface ViewController ()<UITextFieldDelegate>
{
    RACCommand *command;
}
@property (strong, nonatomic) IBOutlet UITextField *userTextField;
@property (strong, nonatomic) IBOutlet UITextField *pwdTextField;
@property (strong, nonatomic) IBOutlet UIButton *loginBtn;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //RACSignal必须是要有订阅者才能发送消息
    RACSignal *signal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        //发送信号,由订阅者接收
        [subscriber sendNext:@"发送信号"];
        //不再发送信号,最好发送完成
        [subscriber sendCompleted];
        //取消订阅方法
        return [RACDisposable disposableWithBlock:^{
            //当信号发送完成或者发送错误,就会执行这个block
            NSLog(@"信号被销毁了");
        }];
    }];
    //订阅信号,只有被订阅,信号量内部才会发送消息,执行sendnext方法
    [signal subscribeNext:^(id x) {
        NSLog(@"订阅信号%@",x);
    }];
//===================================================================================================
    //创建信号,只能先订阅才能发送
    RACSubject *subject=[RACSubject subject];
    //订阅信号
    [subject subscribeNext:^(id x) {
        NSLog(@"第一个订阅者%@",x);
    }];
    [subject subscribeNext:^(id x) {
        NSLog(@"第二个订阅者%@",x);
    }];
    //发送消息
    [subject sendNext:@"121212"];
    //发送消息完成后,内部会自动取消订阅者
    [subject sendCompleted];
//===================================================================================================
    //可以先发送消息,也可以先订阅消息
    RACReplaySubject *replaysubject=[RACReplaySubject subject];
    //发送信号
    [replaysubject sendNext:@"1"];
    [replaysubject sendNext:@"2"];
    //订阅信号
    [replaysubject subscribeNext:^(id x) {
        NSLog(@"第一个订阅者接收到数据%@",x);
    }];
    [replaysubject subscribeNext:^(id x) {
        NSLog(@"第二个订阅者接受到数据%@",x);
    }];
//===================================================================================================
    //RAC集合
    //元组
    RACTuple *tuple=[RACTuple tupleWithObjectsFromArray:@[@"123",@"345",@1]];
    NSString *first=tuple[0];
    NSLog(@"%@",first);
    //数组
    NSArray *arr=@[@"213",@"321",@1];
    [arr.rac_sequence.signal subscribeNext:^(id x) {
        NSLog(@"高级写法遍历数组%@",x);
    }];
    //字典
    NSDictionary *dict=@{@"sex":@"女",@"name":@"打交道的",@"age":@18};
    //转换成集合
    [dict.rac_sequence.signal subscribeNext:^(id x) {
        RACTupleUnpack(NSString *key,NSString *value)=x;
        NSLog(@"%@ %@",key,value);
    }];
//===================================================================================================
    //RACMulticastConnection用于相当一个信号,被多次订阅时,为了保证创建信号时,避免多次调用创建信号中的block,造成副作用,可以使用这个类处理。
    //创建信号
    RACSignal *signall=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSLog(@"发送请求");
        [subscriber sendNext:@"1"];//发送消息,订阅者接受消息
        return [RACDisposable disposableWithBlock:^{

        }];
    }];
    //订阅信息-运行结果,会执行两遍发送请求,也就是每次订阅都会发送一次请求
    [signall subscribeNext:^(id x) {
        NSLog(@"接受消息");
    }];
    [signall subscribeNext:^(id x) {
        NSLog(@"接受消息");
    }];
    //解决重复请求的问题
    RACSignal *connectionSignal=[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSLog(@"发送请求");
        [subscriber sendNext:@1];
        return [RACDisposable disposableWithBlock:^{

        }];
    }];
    //创建链接
    RACMulticastConnection *connection=[connectionSignal publish];
    //订阅信息
    [connection.signal subscribeNext:^(id x) {
        NSLog(@"订阅者一信号");
    }];
    [connection.signal subscribeNext:^(id x) {
        NSLog(@"订阅者二信号");
    }];
    //连接,激活信号
    [connection connect];
//===================================================================================================
    //RACCommand:RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程-使用场景:监听按钮点击,网络请求
    //创建命令
    RACCommand *command=[[RACCommand alloc]initWithSignalBlock:^RACSignal *(id input) {
        NSLog(@"执行命令");
        //创建信号,用来传递数据
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [subscriber sendNext:@"请求数据"];
            //注意:数据传递完,最好用sendCompleted,这时命令才执行完
            [subscriber sendCompleted];
            return [RACDisposable disposableWithBlock:^{
                NSLog(@"数据销毁");
            }];
        }];
    }];
    //强引用命令,,不要被销毁,否则接收不到消息
    command=command;
    [command.executing subscribeNext:^(id x) {
        if ([x boolValue]==YES) {
            NSLog(@"当前正在执行");
        }else{
            NSLog(@"执行完成/没有执行");
        }
    }];
    //执行命令
    [command execute:@1];
//===================================================================================================
    //RAC的高级用法
    RACSubject *signalOFSignal=[RACSubject subject];
    RACSubject *signalA=[RACSubject subject];
    //RACSignal *signalB=[RACSubject subject];
    [signalOFSignal.switchToLatest subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    //发送信号
    [signalOFSignal sendNext:signalA];

    [signalA sendNext:@1];
    [signalA sendNext:@"BB"];
    [signalA sendNext:@"11"];

}
@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值