美文网首页
ReactiveCocoa + MVVM

ReactiveCocoa + MVVM

作者: PM_xia | 来源:发表于2018-03-30 17:21 被阅读29次

    ReactiveCocoa函数响应式编程。它的宗旨是Streams of values over time,随着时间变化而不断流动的数据流

    主要解决的问题:

    1、UI数据绑定:UI控件通常需要绑定一个事件,RAC可以方便的绑定任何数据流到控件上。

    2、用户交互事件绑定:RAC为可交互的UI控件提供了一系列能发送Signal信号的方法。这些数据流会在用户交互中相互传递。

    3、解决状态以及状态之间依赖过多的问题:使用RAC的绑定之后,可以不用在关心各种负责的状态,isSelect,isFinish…等,也解决了在后期难维护的问题;

    4、消息传递机制的大统一:OC中消息传递机制有:Delegate、Block、Target-Action、Timers、KVO,可以用RAC统一处理;

    基本用法如下:

    完整步骤:

    1、[RACSignal createSignal]来获得signal(信号);

    2、[signal subscribeNext] 订阅信号;

    3、[subscriber sendNext] 发送信号;

    4、[disposable dispose] 销毁信号(自己不用手动调用,内部会自动调用)

    步骤一:[RACSignal createSignal] 创建信号

    [RACSignal createSignal] 会调用子类[RACDynamicSignal createSignal]方法 该方法新建一个RACDynamicSignal对象(RACSignal子类),并把传进来的didSubscribe block保存起来,将signal命名为 “+createSignal:” 

    步骤二:[signal subscribeNext] 订阅信号

    RACSignal.m中:

    - ( RACDisposable *)subscribeNext:( void (^)( id x))nextBlock {

      RACSubscriber *o = [ RACSubscriber  subscriberWithNext :nextBlock error : NULL  completed : NULL ];

      return [ self  subscribe :o];

    }

    RACSignal调用subscribeNext方法,返回一个RACDisposable。

    RACSubscriber.m中:

    + ( instancetype )subscriberWithNext:( void (^)( id x))next error:( void (^)( NSError *error))error completed:( void (^)( void ))completed {

      RACSubscriber *subscriber = [[ self  alloc ] init ];

    subscriber-> _next = [next copy ];

    subscriber-> _error = [error copy ];

    subscriber-> _completed = [completed copy ];

      return subscriber;

    }

    在这个方法中会新建一个RACSubscriber对象,并传入nextBlock,errorBlock,completedBlock,subscriberWithNext方法把传入的3个block都保存分别保存到自己对应的block中 。

    RACDynamicSignal.m中:

    - (RACDisposable *)subscribe:(id)subscriber {

        RACCompoundDisposable *disposable = [RACCompoundDisposable compoundDisposable];

        subscriber = [[RACPassthroughSubscriber alloc] initWithSubscriber:subscriber signal:self disposable:disposable];

        if (self.didSubscribe != NULL) {

            RACDisposable *schedulingDisposable = [RACScheduler.subscriptionScheduler schedule:^{

                RACDisposable *innerDisposable = self.didSubscribe(subscriber);

                [disposable addDisposable:innerDisposable];

            }];

            [disposable addDisposable:schedulingDisposable];

        }

        return disposable;

    }

    RACSignal调用subscribeNext方法,最后return的时候,会调用[self subscribe:o],这里实际是调用了RACDynamicSignal类里面的subscribe方法。



    这个subscriber 将传进来的nextBlock、errorBlock、completedBlock保存了起来;

    相关文章

      网友评论

          本文标题:ReactiveCocoa + MVVM

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