ReactiveCocoa之常见用法(二)

ReactiveCocoa开发中常见用法。

 

 代替代理:

 rac_signalForSelector:用于替代代理。

 

 代替KVO :

 rac_valuesAndChangesForKeyPath:用于监听某个对象的属性改变。

 

 监听事件:

 rac_signalForControlEvents:用于监听某个事件。

 

 代替通知:

 rac_addObserverForName:用于监听某个通知。

 

 监听文本框文字改变:

 rac_textSignal:只要文本框发出改变就会发出这个信号。

 

 处理当界面有多次请求时,需要都获取到数据时,才能展示界面

 rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发第一个selector参数的方法。

 使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。


温馨提示:Demo用到的第三方

 导入的第三方框架

 pod 'ReactiveCocoa', '~> 2.5'

 pod 'Masonry', '~> 0.6.4'

 pod 'LxDBAnything', '1.1.0'


代码:

@weakify(Obj)和@strongify(Obj),一般两个都是配套使用,在主头文件(ReactiveCocoa.h)中并没有导入,需要自己手动导入,RACEXTScope.h才可以使用。但是每次导入都非常麻烦,只需要在主头文件自己导入就好了。

[objc]  view plain  copy
  1. /*************************************基础部分**************************************************/  
  2. #pragma mark --textField属性变化  
  3. -(void)textFieldChange  
  4. {  
  5.       
  6.     //初始化一个textField控件  
  7.     UITextField *textField = ({  
  8.           
  9.         UITextField *textField = [[UITextField alloc] init];  
  10.         textField.backgroundColor = [UIColor cyanColor];  
  11.           
  12.         textField ;  
  13.     });  
  14.       
  15.     textField.delegate = self ;  
  16.       
  17.     [self.view addSubview:textField];  
  18.     @weakify(self);  
  19.     [textField mas_makeConstraints:^(MASConstraintMaker *make) {  
  20.         @strongify(self);  
  21.         make.size.mas_equalTo(CGSizeMake(18040));  
  22.         make.center.equalTo(self.view);  
  23.     }];  
  24.       
  25.   
  26.       
  27.     /*****************监听textField的属性变化情况*******************/  
  28.   
  29.     //RAC内部封装好的类  
  30.     //默认执行1次,所以会有打印,原因:请查看RAC底层bind,hook的思想  
  31.     //监听文本框的文字改变  
  32.     [textField.rac_textSignal subscribeNext:^(id x) {  
  33.         LxDBAnyVar(x);  
  34.           
  35.     }];  
  36.   
  37. }  
  38.   
  39.   
  40. #pragma mark -- Button用法  监听事件  
  41. -(void)textBtn  
  42. {  
  43.     UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];  
  44.     [button setTitle:@"点击" forState:UIControlStateNormal];  
  45.     button.backgroundColor = [UIColor redColor];  
  46.     [self.view addSubview:button];  
  47.       
  48.     @weakify(self);  
  49.     [button mas_makeConstraints:^(MASConstraintMaker *make) {  
  50.         @strongify(self);  
  51.         make.size.mas_equalTo(CGSizeMake(self.view.bounds.size.width30));  
  52.         make.bottom.equalTo(self.view).offset(0);  
  53.     }];  
  54.       
  55.     // 监听事件  
  56.     // 把按钮点击事件转换为信号,点击按钮,就会发送信号  
  57.     [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {  
  58.           
  59.         LxPrintf(@"进来了");  
  60.         RACViewController *VC = [[RACViewController alloc] init];  
  61.           
  62.         @strongify(self);  
  63.         [self presentViewController:VC animated:YES completion:^{  
  64.               
  65.             LxPrintf(@"%s",__func__);  
  66.               
  67.         }];  
  68.           
  69.     }];  
  70.   
  71. }  
  72.   
  73.   
  74. #pragma mark --手势  
  75. -(void)addTap  
  76. {  
  77.     /**************手势*****************/  
  78.       
  79.     self.view.userInteractionEnabled = YES ;  
  80.       
  81.     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];  
  82.     [[tap rac_gestureSignal] subscribeNext:^(id x) {  
  83.           
  84.         LxDBAnyVar(x);  
  85.           
  86.     }];  
  87.       
  88.     [self.view addGestureRecognizer:tap];  
  89. }  
  90.   
  91. #pragma mark --通知中心  
  92. -(void)notifiCenter  
  93. {  
  94.     /**************通知*****************/  
  95.       
  96.     [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(id x) {  
  97.           
  98.         LxDBAnyVar(x);  
  99.           
  100.     }];  
  101. }  
  102.   
  103.   
  104.   
  105. #pragma mark --代理  
  106. -(void)delegateDemo  
  107. {  
  108.     UIAlertView *alterView = [[UIAlertView alloc] initWithTitle:@"RAC" message:@"ReactiveCocoa" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ensure", nil nil];  
  109.       
  110.     //方法一:代理  
  111.     //    [[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(id x) {  
  112.     //  
  113.     //        RACTuple *tuple = (RACTuple *)x ;  //类似于swift的元组  
  114.     //  
  115.     //        LxDBAnyVar(tuple);  
  116.     //  
  117.     //        LxDBAnyVar(tuple.first);  
  118.     //        LxDBAnyVar(tuple.second);  
  119.     //        LxDBAnyVar(tuple.third);  
  120.     //  
  121.     //    }];  
  122.       
  123.     [alterView show];  
  124.       
  125.       
  126.     //方法二:内部封装的方法  
  127.     //更简单的方式  
  128.     [[alterView rac_buttonClickedSignal] subscribeNext:^(id x) {  
  129.           
  130.         LxDBAnyVar(x);  
  131.           
  132.     }];  
  133.       
  134. }  
  135.   
  136.   
  137.   
  138. #pragma mark -- KVO  
  139. -(void)addKvo  
  140. {  
  141.     UIScrollView *scrollView = [[UIScrollView alloc] init];  
  142.     scrollView.delegate = (id<UIScrollViewDelegate>)self ;  
  143.     [self.view addSubview:scrollView];  
  144.       
  145.       
  146.     UIView *scrollViewContentView = [[UIView alloc] init];  
  147.     scrollViewContentView.backgroundColor = [UIColor yellowColor];  
  148.     [scrollView addSubview:scrollViewContentView];  
  149.       
  150.       
  151.     @weakify(self);  
  152.       
  153.     [scrollView mas_makeConstraints:^(MASConstraintMaker *make) {  
  154.           
  155.         @strongify(self);  
  156.         make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(80808080));  
  157.           
  158.     }];  
  159.       
  160.       
  161.     [scrollViewContentView mas_makeConstraints:^(MASConstraintMaker *make) {  
  162.           
  163.         @strongify(self);  
  164.         make.edges.equalTo(scrollView);  
  165.         make.size.mas_equalTo(CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame));  
  166.           
  167.     }];  
  168.       
  169.       
  170.     [RACObserve(scrollView, contentOffset) subscribeNext:^(id x) {  
  171.           
  172.         LxDBAnyVar(x);  
  173.           
  174.     }];  
  175.       
  176. }  
  177.   
  178. //处理当界面有多次请求时,需要都获取到数据时,才能展示界面  
  179. -(void)moreRequest  
  180. {  
  181.     /* 
  182.      1.rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发第一个selector参数的方法。 
  183.      2.使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。 
  184.      */  
  185.       
  186.     //处理多个请求,都返回结果的时候,统一做处理.  
  187.     RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {  
  188.           
  189.         // 发送请求1  
  190.         [subscriber sendNext:@"发送请求1"];  
  191.         return nil;  
  192.     }];  
  193.       
  194.     RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {  
  195.         // 发送请求2  
  196.         [subscriber sendNext:@"发送请求2"];  
  197.         return nil;  
  198.     }];  
  199.       
  200.     // 使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。  
  201.     [self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];  
  202.   
  203. }  
  204.   
  205. // 更新UI  
  206. - (void)updateUIWithR1:(id)data r2:(id)data1  
  207. {  
  208.     NSLog(@"更新UI%@  %@",data,data1);  
  209. }  
  210.   
  211. #pragma mark --定时器  
  212. -(void)RACSchedulerAndMain  
  213. {  
  214.     /**************定时器*****************/  
  215.       
  216.     //1.延迟某个时间再做某件事  
  217.     //    [[RACScheduler mainThreadScheduler] afterDelay:2 schedule:^{  
  218.     //  
  219.     //        LxDBAnyVar(rac);  
  220.     //  
  221.     //    }];  
  222.       
  223.     //2.每间隔多长时间做一件  
  224.     [[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]] subscribeNext:^(id x) {  
  225.           
  226.                 LxDBAnyVar(x);  
  227.         //        LxPrintAnything(@"55555555");  
  228.     }];  
  229.       
  230.       
  231.     //这是定时器最常用的两种方法,第一种方法,延迟时间去做某件事,更改afterDelay的属性,第二种方法,每间隔躲藏时间去做一件事,更改interval的属性  
  232.   
  233. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值