ReactiveCocoa的實際應(yīng)用
1.監(jiān)聽方法執(zhí)行
[[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的代理)
[_passWordTextField.rac_textSignal subscribeNext:^(id x) {
_passWordLabel.text = x;
}];
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);
}];
//方法默認(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]];