ReactiveCocoa進(jìn)階(1)

ReactiveCocoa的實際應(yīng)用

1.監(jiān)聽方法執(zhí)行
  • 方法:rac_signalForSelector
[[v rac_signalForSelector:@selector(touchesBegan:withEvent:)] subscribeNext:^(id  _Nullable x) {
    NSLog(@"點(diǎn)擊了我");
 }];
  • 這個方法是創(chuàng)建對象中一定會調(diào)用的,所以在此方法中可以監(jiān)聽各個系統(tǒng)方法的執(zhí)行,換了一種方式來寫各個系統(tǒng)方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    ViewController *vc = [super allocWithZone:zone];
    // ViewDidLoad
    [[vc rac_signalForSelector:@selector(viewDidLoad)] subscribeNext:^(id  _Nullable x) {
        NSLog(@"ViewDidLoad");
    }];
    // ViewWillAppear
    [[vc rac_signalForSelector:@selector(viewWillAppear:)] subscribeNext:^(id  _Nullable x) {
        NSLog(@"ViewWillAppear");
    }];
    return vc;
}
2.監(jiān)聽按鈕點(diǎn)擊
  • 方法:rac_signalForControlEvents
[[_button rac_signalForControlEvents:UIControlEventTouchDown] subscribeNext:^(id x) {
}];
3.監(jiān)聽文字的改變 :(替代textField的代理)
  • 方法:rac_textSignal
[_passWordTextField.rac_textSignal subscribeNext:^(id x) {
    _passWordLabel.text = x;
}];
  • 方法:宏定義 RAC() 信號綁定
RAC(_passWordLabel, text) = _passWordTextField.rac_textSignal;
  • 錯誤示范
//這樣并不能獲取textField的文字信號,獲取的是textField本身的信號,寫法錯誤
[[_passWordTextField rac_signalForControlEvents:UIControlEventValueChanged] subscribeNext:^(id x) {
    NSLog(@"%@", x);
    _passWordLabel.text = x; 
}];
4.代替KVO
  • 方法:rac_valuesForKeyPath:@keypath(self, age) observer:self
    //方法默認(rèn)監(jiān)聽新值和舊值
    [[self rac_valuesForKeyPath:@keypath(self, age) observer:self] subscribeNext:^(id x) {
        NSLog(@"0 - age = %d", self.age);
    }];
  • 方法:rac_valuesAndChangesForKeyPath:@"age" options:NSKeyValueObservingOptionNew observer:self
    //按照選項監(jiān)聽新值或是舊值
    [[self rac_valuesAndChangesForKeyPath:@"age" options:NSKeyValueObservingOptionNew observer:self] subscribeNext:^(id x) {
        NSLog(@"1 - age = %d", self.age);
    }];
  • 方法:rac_observeKeyPath:@"age" options:NSKeyValueObservingOptionNew observer:self block:
    //按照選項監(jiān)聽新值或是舊值
    [self rac_observeKeyPath:@"age" options:NSKeyValueObservingOptionNew observer:self block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
        NSLog(@"2 - age = %d", self.age);
    }];
  • 方法:宏定義RACObserve()
//方法默認(rèn)監(jiān)聽新值和舊值
[RACObserve(self, age) subscribeNext:^(id x) {
    NSLog(@"3 - age = %d", self.age);
}];
5.代替通知
  • 方法:rac_addObserverForName
//不需要手動管理(移除)觀察者
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"Note" object:nil] subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];
[[NSNotificationCenter defaultCenter] postNotificationName:@"Note" object:nil];
6.當(dāng)某幾個信號執(zhí)行完畢再去調(diào)用一個方法(rac_liftSelector)
  • 注意:有幾個信號就必須有幾個參數(shù),參數(shù)就是訂閱者發(fā)出的數(shù)據(jù)
    // 創(chuàng)建請求最熱數(shù)據(jù)信號
    RACSignal *hotSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        // 請求最熱數(shù)據(jù)
        [subscriber sendNext:@"最熱數(shù)據(jù)"];
        return nil;
    }];
    // 創(chuàng)建請求最新數(shù)據(jù)信號
    RACSignal *newSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        // 請求最新的數(shù)據(jù)
        [subscriber sendNext:@"最新數(shù)據(jù)"];
        return nil;
    }];
    // Selector:當(dāng)數(shù)組所有信號都發(fā)送next之后調(diào)用
    [self rac_liftSelector:@selector(updateUIWithHot:new:) withSignalsFromArray:@[hotSignal,newSignal]];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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