ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架 Github-ReactiveCocoa地址
一直听说RAC,但一直未使用过,最近不算忙,研究和学习了一下,非常感谢 峥吖大神对RAC 的细解,受益匪浅。
ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的新框架。
截取Github上对ReactiveCocoa的说明:
RAC是提供事件流,通过信号源和信号源提供者(产生者),信号接受者协和来完成。 借用面向对象的一句话,万物皆是流的形式,通过一方发出信号,一方接受信号来完成不同事件。
ReactiveCocoa作用
代理方法block 回调通知行为控制和事件的响应链协议KVO……高内聚,低耦合,使代码更加内聚,也便于代码的读取
不需要考虑调用顺序,只需要知道考虑结果,类似于蝴蝶效应,产生一个事件,会影响很多东西,这些事件像流一样的传播出去,然后影响结果,借用面向对象的一句话,万物皆是流。
是把操作尽量写成一系列嵌套的函数或者方法调用。 特点:每个方法必须有返回值(本身对象),把函数或者Block当做参数,block参 数(需要操作的值)block返回值(操作结果)。
ReactiveCocoa结合了 函数式编程(Functional Programming)和 响应式编程(Reactive Programming)各自的优点,产生一种新的语法
如何导入ReactiveCocoa框架 1.CocoaPods
pod 'ReactiveCocoa'有的需要在podfile中加入use_frameworks!,到时候终端会提醒的 我导入时需要加入target,如图所示
2.手动导入 由于工程之前一直是手动导入第三方框架,所以也希望手动添加ReactiveCocoa这个框架,但ReactiveCocoa在GitHub上并没有说明如何添加,需要哪些依赖等,所以自己直接把ReactiveCocoa整个文件夹拖到工程中,build以后,哪里报错修改哪里,最后不需要添加任何依赖,万幸,手动导入成功
RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。
只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者去发出。
默认一个信号都是冷信号,也就是值改变了,也不会触发,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
如何订阅信号:调用信号RACSignal的subscribeNext就能订阅。
// 1.创建信号 RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { // block调用时刻:每当有订阅者订阅信号,就会调用block。 // 2.发送信号 [subscriber sendNext:@"我是一个信号类"]; // 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。 [subscriber sendCompleted]; // block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。 return [RACDisposable disposableWithBlock:^{ // 执行完Block后,当前信号就不在被订阅了。 NSLog(@"信号被销毁"); }]; }]; self.signal = signal; // 3.订阅信号,才会激活信号 [signal subscribeNext:^(id x) { NSLog(@"接收的数据:%@",x); }];表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。
用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
[RACDisposable disposableWithBlock:^{ // 执行完Block后,当前信号就不在被订阅了。 NSLog(@"信号被销毁"); }];RACSubject:信号提供者,自己可以充当信号,又能发送信号。 RACSubject使用步骤:
1.创建信号 [RACSubject subject],跟RACSiganl不一样,创建信号时没有block。2.订阅信号 - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock3.发送信号 sendNext:(id)value // 1.创建信号 RACSubject *subject = [RACSubject subject]; // 2.订阅信号 [subject subscribeNext:^(id x) { // block调用时刻:当信号发出新值,就会调用. NSLog(@"第一个订阅者:%@",x); }]; [subject subscribeNext:^(id x) { // block调用时刻:当信号发出新值,就会调用. NSLog(@"第二个订阅者:%@",x); }]; // 3.发送信号 [subject sendNext:@"发送信号"];这些只是对 ReactiveCocoa 的初步了解以及基本使用,还有更多功能和方法,需要我们去慢慢研究