您的位置:首页 > Web前端 > React

ReactiveCocoa常见用法练习

2017-09-20 15:53 295 查看
#pragma mark - RAC Text3

- (void)RACText3 {
/********************************************************************************
1⃣️.rac_signalForSelector(替换代理,监听点击事件)
rac_signalForSelector用于监听某个对象调用某个方法,只要对象调用方法就会产生一个信号;
********************************************************************************/
[_turnBtn addTarget:self action:@selector(turnAction:) forControlEvents:UIControlEventTouchUpInside];
RACSignal *signal = [self rac_signalForSelector:@selector(turnAction:)];
[signal subscribeNext:^(id  _Nullable x) {
NSLog(@"调用了跳转");
}];

/********************************************************************************
2⃣️.代替KVO
rac_valuesAndChangesForKeyPath用于监听某个对象的属性改变
********************************************************************************/
// 监听按钮的选择状态属性
[_turnBtn rac_observeKeyPath:@"selected" options:NSKeyValueObservingOptionNew observer:nil block:^(id value, NSDictionary *change, BOOL causedByDealloc, BOOL affectedOnlyLastComponent) {
// 只要监听的属性一改变调用
NSLog(@"------状态改变");
}];

/********************************************************************************
3⃣️.rac_signalForControlEvents监听事件
********************************************************************************/
// 按钮产生一个事件,就会产生一个信号
[[_btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"按钮被点击");
}];

_btn.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
NSLog(@"点击按钮");
return [RACSignal empty];
}];

/********************************************************************************
4⃣️.rac_addObserverForName代替接收通知
********************************************************************************/
RACSignal *signal2 = [[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil];
[signal2 subscribeNext:^(id  _Nullable x) {
NSLog(@"键盘即将出现");
}];

/********************************************************************************
5⃣️.rac_textSignal监听文本框文字变化
只要文本框发生改变就会发出信号
********************************************************************************/
[_textFiled.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
// textFiled中输入的文字
NSLog(@"%@",x);
}];

/********************************************************************************
6⃣️.处理页面有多个请求时,需要全部获取到数据,才能展示界面
********************************************************************************/
RACSignal *requestSignal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
// 第一个网络请求
NSLog(@"在这里进行第1个网络请求");

// 请求到数据之后发送出去
[subscriber sendNext:@"数据1"];

return nil;
}];

RACSignal *requestSignal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
// 第二个网络请求
NSLog(@"在这里进行第2个网络请求");

// 请求到数据之后发送出去
[subscriber sendNext:@"数据2"];

return nil;
}];

/*
只有当两个网络请求都完成之后才会调用
4000
selector
@selector注意点:
参数根据信号数组元素决定
调用的方法的参数类型与信号组发出的数据的类型要一致,即data1->requestSignal1,data2->requestSignal2
*/
[self rac_liftSelector:@selector(reciveDataWithData1:data2:) withSignalsFromArray:@[requestSignal1,requestSignal2]];
}

- (void)reciveDataWithData1:(NSString *)data1 data2:(NSString *)data2 {
NSLog(@"%@-%@",data1,data2);
}

- (void)turnAction:(UIButton *)btn {
btn.selected = !btn.selected;
NSLog(@"跳转");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: