RAC是什么?
RAC — ReactiveCocoa(RAC) Github 一个开源框架!!
RAC — 函数响应编程框架!!
RAC有什么用?
帮助我们更简单霸气的处理事件!!
RAC里面最常见和常用的类!!!(注意先pod 'ReactiveCocoa','4.0.0')
·RACSignal : 信号类!
- 通过RACSignal创建一个信号!! (默认是: 冷信号!!)
- 通过订阅者!订阅这个信号!(变成: 热信号!!)
- 发送信号!!
RACDisposable:它可以帮助我们取消订阅.信号发送完毕了 ,失败了.
RACSubscriber(协议):订阅者(发送信号!)
RACSubject :信号提供者!!,自己可以充当信号,又能够发送信号!!
RACSignal(信号类)的应用
#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// RACSignal: 信号类,当我们有数据产生,创建一个信号!
//1.创建信号(冷信号!)
//didSubscribe调用:只要一个信号被订阅就会调用!!
//didSubscribe作用:利用subscriber发送数据!!
RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//3.发送数据subscriber它来发送
[subscriber sendNext:@"呵呵哈哈嘿嘿"];
return nil;
}];
//2.订阅信号(热信号!!)
//nextBlock调用:只要订阅者发送数据就会调用!
//nextBlock作用:处理数据,展示UI界面!
[signal subscribeNext:^(id x) {
//x:信号发送的内容!!
NSLog(@"%@",x);
}];
}
原理图:
RACDisposable取消订阅者的应用
#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface ViewController ()
/** */
@property(nonatomic,strong)id<RACSubscriber> subscriber;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建信号(冷信号!)
RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//3.发送数据subscriber它来发送
[subscriber sendNext:@"呵呵哈哈嘿嘿"];
_subscriber = subscriber;
return [RACDisposable disposableWithBlock:^{
//只要信号取消订阅就会来这里
//清空资源!!
NSLog(@"哥么来了!!");
}];
}];
//2.订阅信号(热信号!!)
RACDisposable * disposable = [signal subscribeNext:^(id x) {
//x:信号发送的内容!!
NSLog(@"%@",x);
}];
//默认一个信号发送数据完毕就会主动取消订阅
//只要订阅者在,就不会自动取消订阅
//手动取消订阅
[disposable dispose];
}
RACSubscriber(协议):订阅者(发送信号!)
#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建信号
RACSubject * subject = [RACSubject subject];
//2.订阅信号
//不同的信号订阅的方式不一样!!(因为类型不一样,所以调用的方法不一样)
//RACSubject处理订阅:拿到之前的_subscribers保存订阅者
[subject subscribeNext:^(id x) {
NSLog(@"接受到了数据:%@",x);
}];
//3.发送数据
//遍历出所有的订阅者,调用nextBlock
[subject sendNext:@"汉堡包"];
}
原理图:
RAC的简单应用(功能
类似block和代理反向传值和传事件)
HKView.h
#import <UIKit/UIKit.h>
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface HKView : UIView
/** */
@property(nonatomic,strong)RACSubject * btnClickSingnal;
@end
HKView.m
#import "HKView.h"
@implementation HKView
-(RACSubject *)btnClickSingnal
{
if (!_btnClickSingnal) {
_btnClickSingnal = [RACSubject subject];
}
return _btnClickSingnal;
}
-(IBAction)btnClick:(id)sender{
//通知外面!!
[self.btnClickSingnal sendNext:self.backgroundColor];
}
@end
ViewController.m
#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>
#import "HKView.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet HKView *HKView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//订阅信号
[self.HKView.btnClickSingnal subscribeNext:^(id x) {
self.view.backgroundColor = x;
}];
}