美文网首页
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