ReactiveCocoa常见用法练习

来源:互联网 发布:域名ip地址 编辑:程序博客网 时间:2024/06/05 01:02
#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;    }];    /*      只有当两个网络请求都完成之后才会调用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(@"跳转");}

原创粉丝点击