RAC中用常見的六種應(yīng)用場(chǎng)景,作為入門階段的學(xué)習(xí),有必要了解一下。
1.代替代理 主要通過RACSubject 和 rac_signalForSelector
2.代替KVO
3.監(jiān)聽事件
4.代替通知
5.監(jiān)聽文本框
6.處理界面有多次請(qǐng)求,需要都請(qǐng)求到數(shù)據(jù)時(shí),才能展示界面
===================代替代理===============
創(chuàng)建一個(gè)繼承自UIView的TestView類,然后在.h文件中添加一個(gè)@property(nonatomic,strong)RACSubject *btnClickSingal;屬性。
.m文件中,在這個(gè)TestView上添加一個(gè)按鈕,然后初始化btnClickSingal這個(gè)屬性,以及添加按鈕的點(diǎn)擊事件。
#import "TestView.h"
@implementation TestView
- (RACSubject *)btnClickSingal{
if (_btnClickSingal == nil) {
_btnClickSingal = [RACSubject subject];
}
return _btnClickSingal;
}
- (IBAction)btnClick:(id)sender{
//NSLog(@"紅色view監(jiān)聽到按鈕點(diǎn)擊");
//發(fā)送信號(hào)
[self.btnClickSingal sendNext:@"按鈕被點(diǎn)擊了"];
}
@end
在控制器中,導(dǎo)入TestView.h的頭文件。初始化testView。并編寫如下代碼。
- (void)viewDidLoad {
[super viewDidLoad];
//訂閱信號(hào)
[testView.btnClickSingal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
}
===================代替KVO===============
如果使用下面這個(gè)方法要導(dǎo)入頭文件:#import "NSObject+RACKVOWrapper.h",監(jiān)聽testView的frame屬性兩種實(shí)現(xiàn)方法
[testView rac_observeKeyPath:@"frame" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
//
}];
[[_redView rac_valuesForKeyPath:@"frame" observer:nil] subscribeNext:^(id x) {
//x 修改的值 NSRect
NSLog(@"%@",x);
}];
===================監(jiān)聽事件===============
[[_btn rac_signalForControlEvents:UIControlEventTouchUpInside]subscribeNext:^(id x) {
NSLog(@"點(diǎn)擊了按鈕");
NSLog(@"%@",x);
}];
===================監(jiān)聽通知===============
[[[NSNotificationCenter defaultCenter]rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
===================監(jiān)聽文本框===============
[_tf.rac_textSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
=========有多次請(qǐng)求,都請(qǐng)求到數(shù)據(jù)時(shí),再刷新界面=============
說明:因?yàn)橐粋€(gè)頁面可能有多個(gè)模塊,可能有些模塊需要在其他界面上應(yīng)用到,所以電商項(xiàng)目通常會(huì)這樣設(shè)計(jì)。假如有熱銷模塊和最新模塊,當(dāng)數(shù)據(jù)都請(qǐng)求到的時(shí)候再去刷新界面。
- (void)viewDidLoad {
[super viewDidLoad];
//請(qǐng)求熱銷模塊
RACSignal *hotSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//請(qǐng)求數(shù)據(jù)
NSLog(@"請(qǐng)求熱銷模塊數(shù)據(jù)");
[subscriber sendNext:@"熱銷模塊數(shù)據(jù)"];
return nil;
}];
//請(qǐng)求最新模塊
RACSignal *newSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
//請(qǐng)求數(shù)據(jù)
NSLog(@"請(qǐng)求最新模塊數(shù)據(jù)");
[subscriber sendNext:@"最新模塊數(shù)據(jù)"];
return nil;
}];
//數(shù)組中存放的是信號(hào),當(dāng)數(shù)組中所有的信號(hào)都發(fā)送數(shù)據(jù)的時(shí)候,才會(huì)執(zhí)行Selector
/************************************************/
//方法的參數(shù)必須要和數(shù)組的信號(hào)一一對(duì)應(yīng),否則會(huì)崩潰
//發(fā)放的參數(shù):救贖每一個(gè)信號(hào)發(fā)送的數(shù)據(jù)
[self rac_liftSelector:@selector(updateUIWithHotData:newData:) withSignalsFromArray:@[hotSignal,newSignal]];
}
- (void)updateUIWithHotData:(NSString *)hotData newData:(NSString *)newData{
//拿到請(qǐng)求的數(shù)據(jù)
NSLog(@"更新UI 數(shù)據(jù):%@ 數(shù)據(jù):%@",hotData,newData);
}