最近终于闲下来 整理一下东西 这篇就先介绍一下RAC吧 先看简介
ReactiveCocoa(简称RAC),是GitHub上开源的一个应用于iOS和OS X开发的一个新框架.RAC具有函数式编程和响应者编程的特性.
对于iOS开发 来说 响应式 函数式编程 一看到这个握草 牛逼 高大上
什么是响应式编程
推荐一个网址响应式编程(Reactive Programming)介绍
为什么我们要学习RAC?
目前对于我来说 能很程度上 简化代码 使代码清楚明了
我的理解
我的理解就是面对信号编程,例子就是我们在编程中常用到的通知 就是我们自己由事件产生一个信号 需要对这个信号做出反应的对象 注册到通知中心 等有这个信号的时候 通知中心就会通知这个对象执行
ReactiveCocoa的整体结构介绍
既然上面说了 RAC有点类似通知 那 可以初步分析他有几个组成部分 一个通知的产生者 一个通知的接受者 还有一个通知中心 具体就看下面吧
ReactiveCocoa整体可以分为四个部分
信号源(事件流) RACStream 相当于通知的发送者
订阅者 RACSubscriber 通知的接受者
调度器 RACScheduler 通知中心
清洁工 RACDisposable 删除通知监听者
接下里通过几个简单的例子 说一下这几个东西的作用吧
使用RAC
订阅者 RACSubscriber
RAC最基本的入门使用技巧就是对事件的监听。什么地方让人第一想到事件呢,当然是一开始学的button的点击事件了 UIControlEventTouchUpInside
[[Button rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(__kindof UIControl * _Nullable x) {
//你只要执行的方法
}];
rac_signalForControlEvents subscribeNext 直接从字面意思就是 rac订阅一个UIControlEventTouchUpInside事件 然后block 里就是信号执行的方法 是不是很直接其实看到这里 这个其实很像一个框架 叫 BlockKit
那么举一反三,textFild 也可以用同样的方法去写
[[self.textFild rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(idx){NSLog(@"change");}];
其实 这里方式 也就是我们的控件作为RACSubscriber(订阅者去订阅系统 给我们产生的信号)
那么怎么自己产生信号了
点击 这个方法里面可以看到
这里其实是 RAC框架给我们已经创建好了一个信号 下面我就介绍一下
RACSignal使用步骤:
1.创建信号 + (RACSignal *)createSignal:(RACDisposable * (^)(id subscriber))didSubscribe
2.订阅信号,才会激活信号. - (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
3.发送信号 - (void)sendNext:(id)value
* (可以先不看)RACSignal底层实现:
创建信号,首先把didSubscribe保存到信号中,还不会触发。
当信号被订阅,也就是调用signal的subscribeNext:nextBlock
subscribeNext内部会创建订阅者subscriber,并且把nextBlock保存到subscriber中。
subscribeNext内部会调用siganl的didSubscribe // 3.siganl的didSubscribe中调用[subscriber sendNext:@1];
sendNext底层其实就是执行subscriber的nextBlock
1.创建信号 RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id subscriber) {
// block调用时刻:每当有订阅者订阅信号,就会调用block。 // 2.发送信号 [subscriber sendNext:@1];
// 如果不在发送数据,最好发送信号完成,内部会自动调用[RACDisposable disposable]取消订阅信号。 [subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
// block调用时刻:当信号发送完成或者发送错误,就会自动执行这个block,取消订阅信号。 // 执行完Block后,当前信号就不在被订阅了。 NSLog(@"信号被销毁");
}];
}];
// 3.订阅信号,才会激活信号. [siganl subscribeNext:^(id x) {
// block调用时刻:每当有信号发出数据,就会调用block. NSLog(@"接收到数据:%@",x);
}];
调度器RACSubscriber
调度器RACSubscriber,这一部分是使用GCD的串行队列来实现的
清洁工RACDisposable
RACDisposable在ReactiveCocoa中就充当着清洁工的角色,它封装了取消和清理一次订阅所必需的工作。它有一个核心的方法-dispose,调用这个方法就会执行相应的清理工作,这有点类似于NSObject的-dealloc方法。
我们上面使用subscribeNext:^(id x) {}这个方法订阅信号源进行处理之后会生成一个清洁工RACDisposable,我们可以手动的调用dispose方法来进行清理工作。
这篇文章就先介绍到这 下一篇文章 给大家介绍几个常见的使用场景
心急的各位可以先去看一下 http://ios.jobbole.com/82356/