经过ReactiveCocoa(一)的学习,相信你们对ReactiveCocoa有了一些基本认识吧。下面就让咱们来学习ReactiveCocoa的一些基本使用吧!html
在ReactiveCocoa(一)中讲到能够经过RACSubject
代替代理,咱们也能够经过rac_signalForSelector
一样代替代理。react
// 需求:自定义redView,监听红色view中按钮点击 // 以前都是须要经过代理监听,给红色View添加一个代理属性,点击按钮的时候,通知代理作事情 // rac_signalForSelector:把调用某个对象的方法的信息转换成信号,就要调用这个方法,就会发送信号。 // 这里表示只要redV调用btnClick:,就会发出信号,订阅就行了。 [[redV rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) { NSLog(@"点击红色按钮"); }];
rac_valuesAndChangesForKeyPath:
用于监听某个对象的某个属性发生变化。数组
// 需求:每点击一次,年龄增长一次 // 定义一个age属性 - (void)obserVer { [[self rac_valuesForKeyPath:@"age" observer:nil] subscribeNext:^(id x) { NSLog(@"%@",x); }];} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { self.age ++; }
rac_signalForControlEvents:
用于监听某个事件。ide
// 把按钮点击事件转化成信号,点击按钮,就会发送信号 [[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { NSLog(@"监听按钮点击事件"); }];
rac_addObserverForName:
用于监听某个通知。学习
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) { NSLog(@"弹出键盘"); }];
rac_textSignal:
用于监听文本框文字发生改变代理
[[self.textField rac_textSignal] subscribeNext:^(id x) { NSLog(@"text:%@",x); }];
rac_liftSelector:withSignalsFromArray:Signals:
当传入的Signals(信号数组),每个signal都至少sendNext过一次,就会去触发selector参数的方法。code
注意:几个信号,参数一的方法就几个参数,每一个参数对应信号发出的数据,不然运行时会报错。server
- (void)test{ // 建立信号A RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { NSLog(@"数据请求1"); [subscriber sendNext:@"发送请求1回来的数据"]; return [RACDisposable disposableWithBlock:^{ NSLog(@"随便写写"); }]; }]; // 建立信号B RACSignal *signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { NSLog(@"数据请求2"); [subscriber sendNext:@"发送请求2回来的数据"]; return nil; }]; // RAC:就能够判断两个信号有没有都发出内容 // SignalsFromArray:监听哪些信号的发出 // 当signals数组中的全部信号都发送sendNext就会触发方法调用者(self)的selector // 注意:selector方法的参数不能乱写,有几个信号就对应几个参数 // 不须要主动订阅signalA,signalB,方法内部会自动订阅 [self rac_liftSelector:@selector(doneNextWithA:andB:) withSignalsFromArray:@[signalA,signalB]]; } - (void)doneNextWithA:(NSString *)a andB:(NSString *)b { NSLog(@"请求完成,更新UI--a:%@,b:%@",a,b); }
用于给某个对象的某个属性绑定。htm
// 只要文本框文字改变,就会修改label的文字 RAC(self.labelView,text) = _textField.rac_textSignal;
监听某个对象的某个属性,返回的是信号对象
[RACObserve(self, age) subscribeNext:^(id x) { NSLog(@"%@",x); }];
通常都是成对出现,为了不引发循环引用致使内存泄漏的,和block的使用相似。
@weakify(self); [[_redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) { @strongify(self); NavViewController *navVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:NSStringFromClass([NavViewController class])]; [self.navigationController pushViewController:navVC animated:YES]; }];
把数据包装成RACTuple(元组类)
// 把参数中的数据包装成元组 RACTuple *tuple = RACTuplePack(@"Scott_Mr",@20);
把RACTuple(元组类)解包成对应的数据。
// 解包元组,会把元组的值,按顺序给参数里面的变量赋值 // name = @"Scott_Mr" age = @20 RACTupleUnpack(NSString *name,NSNumber *age) = tuple; NSLog(@"%@,%@",name,age);
个人博客即将搬运同步至腾讯云+社区,邀请你们一同入驻:https://cloud.tencent.com/developer/support-plan