iOS开发ReactiveCocoa学习笔记(三)
RAC常用用法:
1.监听按钮的点击事件:
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(100, 100, 80, 40); [button setTitle:@"点击事件" forState:UIControlStateNormal]; [button setBackgroundColor:[UIColor redColor]]; [self.view addSubview:button]; [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { NSLog(@"按钮被点击了"); }];
2.代理的使用:
@interface RedView : UIView //* */ @property (nonatomic, strong) RACSubject *btnClickSignal; @end
#import "RedView.h" @implementation RedView - (void)awakeFromNib { [super awakeFromNib]; } //懒加载信号 - (RACSubject *)btnClickSignal { if (_btnClickSignal == nil) { _btnClickSignal = [RACSubject subject]; } return _btnClickSignal; } - (IBAction)btnClick:(UIButton *)sender { [self.btnClickSignal sendNext:@"按钮被点击了"]; } @end
// 只要传值,就必须使用RACSubject RedView *redView = [[[NSBundle mainBundle] loadNibNamed:@"RedView" owner:nil options:nil] lastObject]; redView.frame = CGRectMake(0, 140, self.view.bounds.size.width, 200); [self.view addSubview:redView]; [redView.btnClickSignal subscribeNext:^(id x) { NSLog(@"---点击按钮了,触发了事件"); }]; // 把控制器调用didReceiveMemoryWarning转换成信号 //rac_signalForSelector:监听某对象有没有调用某方法 [[self rac_signalForSelector:@selector(didReceiveMemoryWarning)] subscribeNext:^(id x) { NSLog(@"控制器调用didReceiveMemoryWarning"); }];
3.KVO
把监听redV的center属性改变转换成信号,只要值改变就会发送信号
// observer:可以传入nil [[redView rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) { NSLog(@"center:%@",x); }];
4.代替通知
UITextField *textfield = [[UITextField alloc] initWithFrame:CGRectMake(100, 340, 150, 40)]; textfield.placeholder = @"监听键盘的弹起"; textfield.borderStyle = UITextBorderStyleRoundedRect; [self.view addSubview:textfield]; [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) { NSLog(@"监听键盘的高度:%@",x); }];
5.监听文字的改变
[textfield.rac_textSignal subscribeNext:^(id x) { NSLog(@"输入框中文字改变了---%@",x); }];
6.处理多个请求,都返回结果的时候,统一做处理.
RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { // 发送请求1 [subscriber sendNext:@"发送请求1"]; return nil; }]; RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { // 发送请求2 [subscriber sendNext:@"发送请求2"]; return nil; }]; // 使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。 [self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]]; // 更新UI - (void)updateUIWithR1:(id)data r2:(id)data1 { NSLog(@"更新UI%@ %@",data,data1); }