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] 创建信号
步骤二:[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方法。