ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,
在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。
比如按钮的点击使用action,ScrollView滚动使用delegate,属性值改变使用KVO等系统提供的方式。其实这些事件,都可以通过RAC处理。
ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中高聚合,低耦合的思想。
其实主要就是函数响应式编程.
先说下如何安装引入框架
使用cocasPod 来安装 没有cocasPod的请走传送门
[ 传送门: http://www.cnblogs.com/taoxu/p/4964395.html]
target 'RACTest' do
use_frameworks!
pod 'ReactiveCocoa', '~>2.5'
end
先导入头文件 #import "ReactiveCocoa.h"
先放一段代码和结果 再详细说明
//信号测试
-(void)testOne
{
//信号类 需要自己发送或者 订阅
RACSignal * singel = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
// subscriber 是订阅者,这是一个协议,不是一个类。发送信号
[subscriber sendNext:@"这是个测试666"];
[subscriber sendNext:@"这是个测试777"];
// 发送完成
[subscriber sendCompleted];
// RACDisposable:用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
// 执行完Block后,当前信号就不在被订阅了。
return [RACDisposable disposableWithBlock:^{
NSLog(@"信号被销毁");
}];
}];
//singel信号类调用subscribeNext方法订阅信号。订阅之后才会激活这个信号,注意顺序!
[singel subscribeNext:^(id x) {
// block调用时刻:每当有信号发出数据,就会调用block.
NSLog(@"接收到数据:%@",x);
}];
}
RACSiganl (信号类)
1:RACSiganl(信号类)只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者subscriber去发出。
2:默认一个信号都是冷信号,就算是值改变了,但你没有订阅这个信号的话它也不会触发的,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。
RACSubject
RACSubject(信号提供者)它自己可以充当信号,又能发送信号
-(void)testTwo
{
//RACSubject(信号提供者)它自己可以充当信号,又能发送信号
RACSubject * subject = [RACSubject subject];
// 自己订阅了信号
[subject subscribeNext:^(id x) {
NSLog(@"现在我是第一个订阅者: %@",x);
}];
[subject subscribeNext:^(id x) {
NSLog(@"现在我是第二个订阅者: %@",x );
}];
// 自己发送了信号
[subject sendNext:@"我发送了第一个信号001"];
[subject sendNext:@"我发送了第一个信号002"];
}
大致原理了解了,基础学习先到这里,下面我们研究如何结合项目实际运用.
- 文本框监测
//文本框监测
-(void)textDemo
{
@weakify(self);
[self.txtFirst.rac_textSignal subscribeNext:^(NSString *value) {
@strongify(self);
self.value = value;
NSLog(@"新的值:%@",value);
}];
//当self.value的值变化时调用Block,这是用KVO的机制,RAC封装了KVO
[RACObserve(self, value) subscribeNext:^(NSString *value) {
NSLog(@"监测到:%@",value);
}];
}
2.kvo监测 在上述方法中已实现 结果如图
3.代理 传统的代理就不写了 直接上rac样式的
在页面加了个按钮点击跳转
- (IBAction)next:(id)sender {
[self delegateDemo];
}
-(void)delegateDemo
{
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
NextViewController *racsub = [storyboard instantiateViewControllerWithIdentifier:@"NextViewController"];
racsub.subject = [RACSubject subject];
[racsub.subject subscribeNext:^(id x) {
NSLog(@"接受到通知:%@",x);
}];
[self presentViewController:racsub animated:YES completion:nil];
}
在 NextViewController 是声明一个属性 其实有点像传统的代码块block
@property (nonatomic, strong) RACSubject *subject;
if (self.subject) {
[self.subject sendNext:@"发送了返回信号"];
}
[self dismissViewControllerAnimated:YES completion:nil];
4 通知
-(void)noticeDemo
{ NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
//发送广播通知
[center postNotificationName:@"work" object:nil userInfo:@{@"key":@"你逗我呢"}];
//接收通知
//RAC的通知不需要我们手动移除
//注册广播通知
RACSignal *siganl = [center rac_addObserverForName:@"work" object:nil];
//设置接收通知的回调处理
[siganl subscribeNext:^(NSNotification *x) {
NSLog(@"测试: %@",x.userInfo[@"key"]);
}];
}
一般项目应用差不多就涉及到这些吧,以后遇到新的应用也会在空闲时更新的!