RAC是什么?
RAC — ReactiveCocoa(RAC) Github 一個開源框架!!
RAC — 函數(shù)響應試編程框架!!
RAC有什么用?
幫助我們更簡單霸氣的處理事件!!
RAC里面最常見和常用的類
- RACSignal : 信號類!
- 通過RACSignal創(chuàng)建一個信號!! (默認是: 冷信號!!)
- 通過訂閱者!訂閱這個信號!(變成: 熱信號!!)
- 發(fā)送信號!!
- RACDisposable:它可以幫助我們?nèi)∠嗛?信號發(fā)送完畢了 ,失敗了
- RACSubscriber(協(xié)議):訂閱者(發(fā)送信號!)
- RACSubject :信號提供者!!,自己可以充當信號,又能夠發(fā)送信號!!
下面通過一段簡單的代碼,了解一下RACSignal
//RACSignal: 信號類,當我們有數(shù)據(jù)產(chǎn)生,創(chuàng)建一個信號!
//1.創(chuàng)建信號(冷信號!)
//didSubscribe調(diào)用:只要一個信號被訂閱就會調(diào)用!!
//didSubscribe作用:利用subscriber發(fā)送數(shù)據(jù)!!
RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//3.發(fā)送數(shù)據(jù)subscriber它來發(fā)送
[subscriber sendNext:@"呵呵哈哈嘿嘿"];
return nil;
}];
//2.訂閱信號(熱信號!!)
//nextBlock調(diào)用:只要訂閱者發(fā)送數(shù)據(jù)就會調(diào)用!
//nextBlock作用:處理數(shù)據(jù),展示UI界面!
[signal subscribeNext:^(id x) {
//x:信號發(fā)送的內(nèi)容!!
NSLog(@"%@",x);
}];
接下來我們再來看看 RACDisposable,它既然是幫助我們?nèi)∠嗛喌模敲次覀円话阍谛盘柊l(fā)送完畢了 或者失敗了,都需要取消訂閱。
默認一個信號發(fā)送數(shù)據(jù)完畢就會主動取消訂閱,只要訂閱者在,就不會自動取消訂閱。有些時候我們不想信號發(fā)送完畢后就取消訂閱,我們可以用一個強引用的屬性來記錄這個訂閱者,當這個訂閱者被強引用以后,就不會自動取消訂閱了,我就需要手動取消訂閱。示例代碼如下
#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface ViewController ()
/** */
@property(nonatomic,strong)id<RACSubscriber> subscriber;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.創(chuàng)建信號(冷信號!)
RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//3.發(fā)送數(shù)據(jù)subscriber它來發(fā)送
[subscriber sendNext:@"呵呵哈哈嘿嘿"];
_subscriber = subscriber;
return [RACDisposable disposableWithBlock:^{
//只要信號取消訂閱就會來這里
//清空資源!!
NSLog(@"哥么來了!!");
}];
}];
//2.訂閱信號(熱信號!!)
RACDisposable * disposable = [signal subscribeNext:^(id x) {
//x:信號發(fā)送的內(nèi)容!!
NSLog(@"%@",x);
}];
//默認一個信號發(fā)送數(shù)據(jù)完畢就會主動取消訂閱
//只要訂閱者在,就不會自動取消訂閱
//手動取消訂閱
[disposable dispose];
}
@end
接下來我們再來看看 RACSubject :信號提供者
它自己可以創(chuàng)建信號,又能夠發(fā)送信號。
//1.創(chuàng)建信號
RACSubject * subject = [RACSubject subject];
//2.訂閱信號
//不同的信號訂閱的方式不一樣!!(因為類型不一樣,所以調(diào)用的方法不一樣)
//RACSubject處理訂閱:拿到之前的_subscribers保存訂閱者
[subject subscribeNext:^(id x) {
NSLog(@"接受到了數(shù)據(jù):%@",x);
}];
//3.發(fā)送數(shù)據(jù)
//遍歷出所有的訂閱者,調(diào)用nextBlock
[subject sendNext:@"漢堡包"];
接下來我們來看一個 RACSubjec簡單的實際使用
現(xiàn)在我們的ViewController里有一個我們自定義的View叫WFView,里面有一個按鈕,當我們點擊這個按鈕時 要通知我們的控制器干事情!
在我們的 WFView.h
#import <UIKit/UIKit.h>
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface HKView : UIView
@property(nonatomic,strong)RACSubject * btnClickSingnal;
@end
WFView.m
#import "WFView.h"
@implementation WFView
-(RACSubject *)btnClickSingnal {
if (!_btnClickSingnal) {
_btnClickSingnal = [RACSubject subject];
}
return _btnClickSingnal;
}
-(IBAction)btnClick:(id)sender {
//通知外面!!
[self.btnClickSingnal sendNext:self.backgroundColor];
}
@end
在我們的控制器中 訂閱信號
//訂閱信號
[self.HKView.btnClickSingnal subscribeNext:^(id x) {
self.view.backgroundColor = x;
}];
是不是很清爽呢?