美文网首页
ReactiveCocoa基础使用

ReactiveCocoa基础使用

作者: zhiyuehl | 来源:发表于2017-11-01 11:45 被阅读0次

简介

RAC(ReactiveCocoa)是一款响应式编程的框架,处理事件逻辑,代理通知KVO都可以使用RAC来解决。利用好它可以省1/2的逻辑代码。够吸引你吗?那就开始学习吧,向大神迈进。


1.CocoaPods导入

OC: pod 'ReactiveCocoa', '~> 2.5'
Swift:pod 'ReactiveCocoa'


2.信号RACSignal

  • RACSiganl:信号类,一般表示将来有数据传递,只要有数据改变,信号内部接收到数据,就会马上发出数据。就像发送通知一样。
  • RACSubscriber:表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。就像注册通知一样。
  • RACDisposable:用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。就像销毁通知一样。
  • 其他类高级使用中讲到。

3.RAC常见用法

  • 代替代理

rac_signalForSelector 自定义view上有个按钮。

[[self.redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
     NSLog(@"点击了红色按钮");
}];
  • 代替KVO

rac_valuesAndChangesForKeyPath监听view的属性变化

[[self.redView rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
     NSLog(@"位置变了");
}];
  • 监听事件

rac_signalForControlEvents监听各类事件

[[self.testButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
     NSLog(@"点击了button%@",x);
}];
  • 代替通知

rac_addObserverForName代替通知

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(NSNotification *notification) {
        NSDictionary *info = notification.userInfo;
        NSValue *keyboardFrameValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
        CGRect keyboardFrame = keyboardFrameValue.CGRectValue;
        NSLog(@"height----%f",keyboardFrame.size.height);
}];
  • 文字框变化

rac_textSignal监听textfield的变化

[self.password.rac_textSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
}];
  • 多事件完成后统一处理

rac_liftSelector:withSignalsFromArray:Signals多网络请求后统一更新UI

RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [subscriber sendNext:@"请求1"];
          NSLog(@"11111");
      });
      return nil;
}];
RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(8.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         [subscriber sendNext:@"请求2"];
         NSLog(@"222");
     });
     return nil;
}];
    
[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];
//更新UI
- (void)updateUIWithR1:(id)data1 r2:(id)data2
{
    NSLog(@"更新UI%@----%@",data1,data2);
}
  • 信号队列,处理多事件顺序执行
RACSignal *singal1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      [subscriber sendNext:@"one"];
      return nil;
}];
    
RACSignal *singal2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      [subscriber sendNext:@"two"];
      return nil;
}];
    
RACSignal *singal3 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      [subscriber sendNext:@"three"];
      return nil;
}];
    
[[RACSignal merge:@[singal3,singal2,singal1]] subscribeNext:^(id x) {
      NSLog(@"信号队列----%@",x);
}];
RAC(self.passwordLabel, text) = self.password.rac_textSignal;
    
    RACTuple *tuple = RACTuplePack(@"hl",@24);
    RACTupleUnpack(NSString *name,NSNumber *age) = tuple;
    NSLog(@"%@---%@",name,age);
    
    [RACObserve(self.redView, center) subscribeNext:^(id x) {
        NSLog(@"333%@",x);
    }];
  • 组合操作
    [self.phoneTextField.rac_textSignal subscribeNext:^(NSString *x) {
        self.phone = x;
    }];
    
    [self.passwordTextField.rac_textSignal subscribeNext:^(NSString *x) {
        self.pswd = x;
    }];
    
    [[[RACSignal combineLatest:@[RACObserve(self, phone),RACObserve(self, pswd)] reduce:^(NSString *txt1,NSString *txt2){
        return @(txt1.length > 2 && txt2.length > 2);
    }] distinctUntilChanged] subscribeNext:^(NSNumber *x) {
        if ([x boolValue]) {
            NSLog(@"yes");
        }else {
            NSLog(@"no");
        }
    }];

最后

demo地址:github

相关文章

网友评论

      本文标题:ReactiveCocoa基础使用

      本文链接:https://www.haomeiwen.com/subject/jjbwpxtx.html