美文网首页
RAC学习笔记(一)

RAC学习笔记(一)

作者: 咩咩sheep | 来源:发表于2017-07-25 13:53 被阅读0次

Signal

RAC的核心是signal,RAC世界所有的消息都是通过信号的方式传递的。

  • 创建信号
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        [subscriber sendNext:@1];
        [subscriber sendNext:@2];
        [subscriber sendCompleted];
        return nil;
    }];

它的内部实现是创建一个RACDynamicSignal,同时将创建信号的block传递给RACDynamicSignal实例。

 + (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe {
    RACDynamicSignal *signal = [[self alloc] init];
    signal->_didSubscribe = [didSubscribe copy];
    return [signal setNameWithFormat:@"+createSignal:"];
}
  • 订阅信号
    信号创建之后如果不被订阅,block不会被执行
[signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"signal: %@", x);
    }];

订阅的内部实现其实也是函数式编程思想,block传递

  • 创建订阅者
RACSubscriber *o = [RACSubscriber subscriberWithNext:nextBlock error:NULL completed:NULL];
[self subscribe:o];
  • 执行创建信号时的block
RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{
            RACDisposable *innerDisposable = self.didSubscribe(subscriber);
            [disposable addDisposable:innerDisposable];
        }];

Bind

信号的绑定是个相对复杂的操作,其内部是创建了一个新的信号

RACSignal *bindSignal = [signal bind:^RACSignalBindBlock _Nonnull{
        return ^(NSNumber *value, BOOL *stop) {
            value = @(value.integerValue * value.integerValue);
            return [RACSignal return:value];
        };
    }];

除去RACDisposable处理过程,bind内部可简化成

- (RACSignal *)bind:(RACSignalBindBlock (^)(void))block {
    return [[RACSignal createSignal:^(id<RACSubscriber> subscriber) {
        RACSignalBindBlock bindingBlock = block();
        return [self subscribeNext:^(id x) {
            BOOL stop = NO;
            id signal = bindingBlock(x, &stop);
            if (signal) {
                [signal subscribeNext:^(id x) {
                    [subscriber sendNext:x];
                } error:^(NSError *error) {
                    [subscriber sendError:error];
                } completed:^{
                    [subscriber sendCompleted];
                }];
            }
            if (signal == nil || stop) {
                [subscriber sendCompleted];
            }
        } error:^(NSError *error) {
            [subscriber sendError:error];
        } completed:^{
            [subscriber sendCompleted];
        }];
    }] setNameWithFormat:@"[%@] -bind:", self.name];
}

因为`RACReturnSignal订阅过程实现了sendNext

[RACScheduler.subscriptionScheduler schedule:^{
        [subscriber sendNext:self.value];
        [subscriber sendCompleted];
    }];

当bindSignal被订阅时

[bindSignal subscribeNext:^(id  _Nullable x) {
    NSLog(@"bindSignal: %@", x);
}];

bindingBlock返回的returnSignal会被订阅,进而触发[subscriber sendNext:x]

相关文章

  • ReactiveCocoa学习笔记整理(一)

    由于近期时间相对宽裕,以及很多朋友询问关于RAC的学习路径以及资料,故而整理一下之前自己学习RAC的学习笔记,供大...

  • RAC研究学习(一)-- 新手入门,用法介绍

    最近项目在重构,采取MVVM+RAC模式,学习之余做点小笔记。 什么是RAC? 简单的说,RAC就是一个第三方库,...

  • ReactiveCocoa & MVVM学习笔记

    网上关于RAC和MVVM的资料非常多,我写这篇主要是因为初学RAC,为自己记个学习笔记。 1. RAC是什么? (...

  • RAC学习笔记(一)

    Signal RAC的核心是signal,RAC世界所有的消息都是通过信号的方式传递的。 创建信号 它的内部实现是...

  • RAC 学习笔记(一)

    一、倒计时初始化信号量 关于zipWith当用 zipWith 链接A和B的时候,只有在A.B每隔都至少发送过一次...

  • RAC 学习笔记

    ReactiveCocoa 主要由以下四大核心组件构成:信号源:RACStream 及其子类;订阅者:RACSub...

  • RAC学习笔记

    学习RAC时总结的知识点,方便以后复习。想学习的童鞋可以直接翻到最后的“传送门”。原创文章,欢迎转载.转载请注明出...

  • RAC学习笔记

    前言 最近,ReactiveCocoa火的不行,网上各种大牛各种说RAC的优点,早就有学习的想法,一直没有付诸行动...

  • RAC学习笔记

    零、类结构关系 1.RACSubject::RACSignal::RACStream. 2.最基础的东西:创建信号...

  • Reactive Cocoa 学习笔记

    Reactive Cocoa 学习笔记 [TOC] 基本概念 什么是RAC ReacticeCocoa 结合了好几...

网友评论

      本文标题:RAC学习笔记(一)

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