RAC学习1
什么是RAC
- 简单说,它是一个第三方库,可以简化写代码的过程
- 官方说,他是一个有GitHub开源的应用于iOS和OS X开发的新框架
特点
- 函数式编程和响应式编程
解决问题
- 解决传统iOS开发过程中,状态和状态之间依赖过多的问题
- 解决MVC框架的问题(C中容易变得庞大复杂,C与对应的M和V耦合度高)
- 统一消息传递机制:iOS中的消息传递机制有 KVO、Notification、delegate、block、target-action
学习资料链接
http://spin.atomicobject.com/2014/02/03/objective-c-delegate-pattern/
http://blog.bignerdranch.com/4549-data-driven-ios-development-reactivecocoa/
http://en.wikipedia.org/wiki/Functional_reactive_programming
http://www.teehanlax.com/blog/reactivecocoa/
http://www.teehanlax.com/blog/getting-started-with-reactivecocoa/
http://nshipster.com/reactivecocoa/
http://cocoasamurai.blogspot.com/2013/03/basic-mvvm-with-reactivecocoa.html
http://iiiyu.com/2013/09/11/learning-ios-notes-twenty-eight/
https://speakerdeck.com/andrewsardone/reactivecocoa-at-mobidevday-2013
http://msdn.microsoft.com/en-us/library/hh848246.aspx
http://blog.leezhong.com/ios/2013/12/27/reactivecocoa-2.html
https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/Documentation/FrameworkOverview.md
http://www.haskell.org/haskellwiki/Functional_Reactive_Programming
http://blog.zhaojie.me/2009/09/functional-reactive-programming-for-csharp.html
代码
https://github.com/Machx/MVVM-IOS-Example
https://github.com/ReactiveCocoa/RACiOSDemo
书籍
视频
配置RAC环境
platform:ios, '8.0'
pod 'ReactiveCocoa'
RAC正式学习
- 1、最重要的类:信号类
- 信号类(RACSiganl):当数据改变时候,信号内部就会发出数据,它本身不具有发送信号的能力,而是内部的一个订阅者发出。
- 默认的信号都是一个冷信号(值改变了,不会触发),只有订阅了这个信号,这个信号才会变成热信号(值改变了,会触发操作)
- 如何订阅信号:调用RACSignal的subscribeNext就能订阅
// RACSignal使用步骤:
// 1.创建信号
+ (RACSignal *)createSignal:(RACDisposable * (^)(id<RACSubscriber> subscriber))didSubscribe
// 2.订阅信号,才会激活信号.
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
// 3.发送信号
- (void)sendNext:(id)value
- 2、常用的方法
- 代替代理: rac_signalForSelector
- 代替KVO: rac_valuesAndChangesForKeyPath:用于监听某个对象的属性改变
- 监听事件: rac_signalForControlEvents:用于监听某个事件
- 代替通知: rac_addObserverForName:用于监听某个通知
- 监听文本框文字的改变: rac_textSignal:只要文本框发出改变就会发出这个信号
- 监听手势: rac_gestureSignal
OC代码
- (IBAction)testBtn:(id)sender {
#pragma mark - RAC监听tf中文字改变
[[self.testTF rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x) {
NSLog(@"change: %@", x);
}];
// 对于textFild的文字更改监听也有更简单的写法
[[self.testTF rac_textSignal] subscribeNext:^(id x) {
}];
#pragma mark - RAC监听手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
[[tap rac_gestureSignal] subscribeNext:^(id x) {
// 监听手势
}];
#pragma mark - RAC监听代理
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"sure" message:@"message" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:@"other", nil];
/**
* @selector 是指这次事件监听的方法
*
* fromProtocol指依赖的代理
*
* tuple.second是ButtonAtIndex中Button的序号
*
* @return
*/
[[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple *tuple) {
NSLog(@"%@", tuple);
}];
[alertView show];
#pragma mark - 监听通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"liyang" object:nil] subscribeNext:^(NSNotification *sender) {
// 当监听到名字是liyang的通知,会执行block里面的方法
// RAC中的通知不需要remove observer,因为在rac_add方法中他已经写了remove
}];
#pragma mark - 监听KVO
UIScrollView *scrolView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 200, 400)];
scrolView.contentSize = CGSizeMake(200, 800);
scrolView.backgroundColor = [UIColor greenColor];
[self.view addSubview:scrolView];
[RACObserve(scrolView, contentOffset) subscribeNext:^(id x) {
NSLog(@"success");
// RACObserve(TARGET, KEYPATH)这种形式,TARGET是监听目标,KEYPATH是要观察的属性值
}];
}