美文网首页
ReactiveCocoa使用介绍

ReactiveCocoa使用介绍

作者: howhyone | 来源:发表于2019-03-20 20:47 被阅读0次

    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

    相关文章

      网友评论

          本文标题:ReactiveCocoa使用介绍

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