GitHub地址:ReactiveCocoa
RAC.png
一、響應(yīng)式編程就是實時響應(yīng)某個事件
// 創(chuàng)建信號
RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"Hello");
// 發(fā)送信號
[subscriber sendNext:@"This is RAC"];
return nil;
}];
// 訂閱信號
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
}];
二、RAC很強大,一行代碼搞定以前的事件監(jiān)聽
舉幾個實際使用案例
1. TargetAction轉(zhuǎn)Block
①UITextField(實時監(jiān)聽輸入框內(nèi)容)
[[self.textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@", x);
}];
②UITextField(實時監(jiān)聽多個輸入框內(nèi)容)
[[RACSignal combineLatest:@[self.nameTextField.rac_textSignal, self.pwdTextField.rac_textSignal]] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@"name : %@, pwd : %@", x.first, x.second);
}];
[[[RACSignal combineLatest:@[self.nameTextField.rac_textSignal, self.pwdTextField.rac_textSignal]] reduceEach:^id _Nullable(NSString *name, NSString *pwd) {
return @(name.length && pwd.length);
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%zd", [x boolValue]);
}];
③UIButton(Button點擊事件)
[[self.button rac_signalForControlEvents:(UIControlEventTouchUpInside)] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@",x);
}];
2. 通知轉(zhuǎn)Block
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidBecomeActiveNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@",x);
}];
3.KVO轉(zhuǎn)Block
[RACObserve(self.person, name) subscribeNext:^(id _Nullable x) {
self.label.text = x;
}];
三、注意事項:
RAC使用@weakify(self);
和@strongify(self);
來避免block循環(huán)引用
@weakify(self);
[[self.textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
@strongify(self);
self.textField.text = @"Hello";
}];