RAC 的核心思想:创建信号 - 订阅信号 - 发送信号 ,并且在 RAC 中我们会看到大量的 block
RACObserve用法
@interface ViewController ()
/** */
@property (nonatomic, copy) NSString *username;
/** */
@property (nonatomic, copy) NSString *password;
/** */
@property (nonatomic, copy) NSString *content;
@end
------------------------------------------------------
// 监听self这个对象里面的一个username属性
[RACObserve(self, username) subscribeNext:^(id _Nullable x) {
NSLog(@"%@", x);
}];
// 因为接受过来的是NSString则可以这样写
[RACObserve(self, username) subscribeNext:^(NSString *string) {
NSLog(@"%@", string);
}];
// 带有过滤效果
[[RACObserve(self, username) filter:^BOOL(NSString *string) {
// 根据条件是否发送出值
return [string containsString:@"aa"];
}] subscribeNext:^(id _Nullable x) {
NSLog(@"%@", x);
}];
// RAC() 宏可以使得绑定表示的更清楚
// combineLatest填入多个监听 reduce根据数组顺序 返回监听到的内容
// 返回的值会被设置到RAC中的content中
RAC(self, content) = [RACSignal combineLatest:@[RACObserve(self, username), RACObserve(self, password)] reduce:^(NSString *name, NSString *pass){
return [NSString stringWithFormat:@"%@%@", name, pass];
}];
/* 监听 TextField 的输入(内容改变就会调用) */
[[textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
/* 添加监听条件 */
[[textField.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length > 5; // 表示输入文字长度 > 5 时才会调用下面的 block
}] subscribeNext:^(NSString * _Nullable x) {
NSLog(@"输入框内容:%@", x);
}];
// 按钮的监听事件
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@ 按钮被点击了", x); // x 是 button 按钮对象
}];
// RAC接受返回值给loginButton对象的enabled属性赋值
RAC(_loginButton, enabled) = [RACSignal combineLatest:@[_username.rac_textSignal, _password.rac_textSignal] reduce:^id _Nullable(NSString * username, NSString * password){
return @(username.length && password.length);
}];
// 替代通知 我们可以省去在dealloc中清除通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardDidShowNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
NSLog(@"%@ 键盘弹起", x); // x 是通知对象
}];
// 当前类中的btnClick方法执行了,就会有回调
[[self rac_signalForSelector:@selector(btnClick)] subscribeNext:^(RACTuple * _Nullable x) {
NSLog(@" view 中的按钮被点击了");
}];
// 监听属性改变
[[button rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id _Nullable x) {
NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];
// 监听属性改变 另一种写法
[RACObserve(button, frame) subscribeNext:^(id _Nullable x) {
NSLog(@"属性的改变:%@", x); // x 是监听属性的改变结果
}];
// 定时器功能 3秒后执行一次
[[RACScheduler mainThreadScheduler]afterDelay:3 schedule:^{
NSLog(@"3秒后执行一次");
}];
// 定时器 每隔两秒执行一次
// 这里要加takeUntil条件限制一下否则当控制器pop后依旧会执行
[[[RACSignal interval:2 onScheduler:[RACScheduler mainThreadScheduler]] takeUntil:self.rac_willDeallocSignal ] subscribeNext:^(id x) {
NSLog(@"每两秒执行一次");
}];
网友评论