ReactiveCocoa使用介绍

2019-03-20  本文已影响0人  howhyone

1 好才会用

开发是遇到:事件响应时需要处理一些业务逻辑,这时会用到代理和block,一个逻辑功能需要在两个文件里实现,维护起来也麻烦,使用ReactiveCocoa可以在一个代码块中试下这个逻辑功能,非常符合高内聚低耦合的思想,方便开发和后续的维护

2ReactiveCocoa的编程思想

1 函数式编程:函数式编程介绍
2响应式编程:响应式编程介绍
所以ReactiveCocoa也叫做函数响应式编程(FRP)框架

3导入ReactiveCocoa

use_frameworks!
pod 'ReactiveCocoa',"2.3.1"

4常见的类和使用

1RACSignal:信号类:

使用createSignal方法创建一个信号,subScribeNext方法订阅这个信号,sendNext发送信息

-(void)signal
{
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@1];
        return [RACDisposable disposableWithBlock:^{
            NSLog(@"默认信号发送完毕被取消");
        }];
    }];
    
    RACDisposable *disposable = [signal subscribeNext:^(id x) {
        NSLog(@"---%@",x);
    }];
    [disposable dispose];
}

2RACSubject:

RACSubject:信号提供者,自己可以充当信号,又能发送信号。
使用场景:通常用来代替代理,有了它,就不必要定义代理了。

-(void)subject
{
    RACSubject *subject = [RACSubject subject];
    [subject subscribeNext:^(id x) {
        NSLog(@"订阅者1 ---%@",x);
    }];
    [subject subscribeNext:^(id x) {
        NSLog(@"订阅者2 --- %@",x);
    }];
    [subject sendNext:@"111"];
    [subject sendNext:@"222"];
}

下面是打印

2019-03-20 20:31:10.355772+0800 ReactiveCocoa[6042:210256] 订阅者1 ---111
2019-03-20 20:31:10.355975+0800 ReactiveCocoa[6042:210256] 订阅者2 --- 111
2019-03-20 20:31:10.356085+0800 ReactiveCocoa[6042:210256] 订阅者1 ---222
2019-03-20 20:31:10.356191+0800 ReactiveCocoa[6042:210256] 订阅者2 --- 222

3RACReplaySubject

RACReplaySubject可以先发送信号再订阅信号,RACSubject不能这样
信号每被订阅 一次,RACReplaySubject对象就发送所有的值

-(void)replaySubject
{
    RACReplaySubject *replaySubject = [RACReplaySubject subject];
    [replaySubject sendNext:@"1111"];
    [replaySubject sendNext:@"222"];
    [replaySubject subscribeNext:^(id x) {
         NSLog(@"第一个订阅者%@",x);
     }];
    [replaySubject subscribeNext:^(id x) {
        NSLog(@"第二个订阅者%@",x);
    }];
}

下面是打印

2019-03-20 20:32:28.917652+0800 ReactiveCocoa[6086:211355] 第一个订阅者1111
2019-03-20 20:32:28.917846+0800 ReactiveCocoa[6086:211355] 第一个订阅者222
2019-03-20 20:32:28.918004+0800 ReactiveCocoa[6086:211355] 第二个订阅者1111
2019-03-20 20:32:28.918104+0800 ReactiveCocoa[6086:211355] 第二个订阅者222

4 RACSequence和RACTuple

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

使用场景:1.字典转模型

-(void)dicTuple
{
    NSDictionary *dict = @{@"name":@"howhyone",@"age":@"20",@"sex":@"男"};
    [dict.rac_sequence.signal subscribeNext:^(id x) {
        RACTupleUnpack(NSString *key,NSString *value) = x;
        NSLog(@"%@-------%@",key,value);
//        NSString *key = x[0];
//        NSString *value = x[1];
    }];
}

5 RACMulticastConnection

当一个信号,被多次订阅时,为了保证创建信号时,避免多次调用创建信号中的block,造成副作用,可以使用这个类处理。

-(void)multicastConnection
{
    RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        NSLog(@"请求一次");
        [subscriber sendNext:@"2"];
        return nil;
    }];
    RACMulticastConnection *connection = [signal publish];
    [connection.signal subscribeNext:^(id x) {
        NSLog(@"第一个订阅者%@",x);
    }];
    [connection.signal subscribeNext:^(id x) {
        NSLog(@"第二个订阅者%@",x);
    }];
    [connection.signal subscribeNext:^(id x) {
        NSLog(@"第三个订阅者%@",x);
    }];
    [connection connect];
}

6 RACCommand

-(void)command
{
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        NSLog(@"input ======= %@",input);
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            NSLog(@"发布数据");
            [subscriber sendNext:@"22"];
            [subscriber sendCompleted];
            return nil;
        }];
    }];
    [command.executionSignals.switchToLatest subscribeNext:^(id x) {
        NSLog(@"拿到信号的方式=%@",x);
    }];
    RACSignal *signal = [command execute:@"11"];
    [signal subscribeNext:^(id x) {
        NSLog(@"d拿到信号的方式一%@",x);
    }];
    [command execute:@"11"];
    [command.executing subscribeNext:^(id x) {
        if ([x boolValue] == YES) {
            NSLog(@"命令正在执行");
        }
        else{
            NSLog(@"命令m完成/没有执行");
        }
    }];
}

总结:

1RACSignal和RACSubject必须要先订阅,是信号变为热信号,再发送信号,RACReplaySubject没这个限制
demoGit地址:https://github.com/howhyone/ReactiveCocoa
参考资料:https://www.cnblogs.com/fengmin/p/5662270.html

上一篇下一篇

猜你喜欢

热点阅读