RAC常見的六種應(yīng)用場(chǎng)景

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);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容