ReactiveCocoa的實際應用
1.監(jiān)聽方法執(zhí)行
[[v rac_signalForSelector:@selector(touchesBegan:withEvent:)] subscribeNext:^(id _Nullable x) {
NSLog(@"點擊了我");
}];
- 這個方法是創(chuàng)建對象中一定會調用的,所以在此方法中可以監(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)聽按鈕點擊
- 方法: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
//方法默認監(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);
}];
//方法默認監(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.當某幾個信號執(zhí)行完畢再去調用一個方法(rac_liftSelector)
- 注意:有幾個信號就必須有幾個參數遥巴,參數就是訂閱者發(fā)出的數據
// 創(chuàng)建請求最熱數據信號
RACSignal *hotSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 請求最熱數據
[subscriber sendNext:@"最熱數據"];
return nil;
}];
// 創(chuàng)建請求最新數據信號
RACSignal *newSignal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 請求最新的數據
[subscriber sendNext:@"最新數據"];
return nil;
}];
// Selector:當數組所有信號都發(fā)送next之后調用
[self rac_liftSelector:@selector(updateUIWithHot:new:) withSignalsFromArray:@[hotSignal,newSignal]];