初玩RAC

之前因为项目的原因以及ReactiveCocoa框架导入到项目老是报错的原因,导致我这边一直没有能好好的将ReactiveCocoa运行起来,最近看了Hank老师的视频,而且项目中我们使用的就是OC,因此还是决定使用ReactiveObjC来尝试一下RAC。

1、下面是写的Demo界面代码:

 1 -(void)createUI
 2 {
 3     self.view.backgroundColor =[UIColor whiteColor];
 4     
 5     UIView  * view = [UIView new];
 6     view.backgroundColor = [UIColor orangeColor];
 7     [self.view addSubview:view];
 8     
 9     _view =view;
10 
11     [view mas_makeConstraints:^(MASConstraintMaker *make) {
12         make.left.top.mas_offset(10);
13         make.right.mas_offset(-10);
14         make.height.mas_equalTo(100);
15         
16     }];
17     
18     UIButton  * btn = [[UIButton alloc] init];
19     _btn=btn;
20     btn.backgroundColor  =[UIColor redColor];
21     [view addSubview:btn];
22     //注意的是当视图为空的时候,界面当然没有办法进行添加,然后自然就会崩溃了
23     [btn addTarget:_view action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
24     [btn mas_makeConstraints:^(MASConstraintMaker *make) {
25         make.left.top.mas_offset(20);
26         make.right.mas_offset(-20);
27         make.height.mas_offset(60);
28     }];
29     
30     UIView * testGes = [UIView new];
31     testGes.backgroundColor = [UIColor redColor];
32     [self.view addSubview:testGes];
33     [testGes mas_makeConstraints:^(MASConstraintMaker *make) {
34         make.top.mas_equalTo(_view.mas_bottom).offset(20);
35         make.left.mas_equalTo(self.view.mas_left).offset(20);
36         make.right.mas_equalTo(self.view.mas_right).offset(-20);
37         make.height.mas_equalTo(100);
38     }];
39     
40 #pragma  可以截取到
41     //1、使用手势也是可以获取到事件,可以截取到
42     UITapGestureRecognizer * ges = [[UITapGestureRecognizer alloc]init];
43     [testGes addGestureRecognizer:ges];
44     
45     [[ges rac_gestureSignal]subscribeNext:^(__kindof UIGestureRecognizer * _Nullable x) {
46         NSLog(@"触发点击事件");
47     }];
48 
49     
50 }

 




2、RAC代码:

-(void)createRac
{
    
#pragma 能截取到
    // 1、View首先不能为空,然后target上面可以添加到其他View上面 2、进行按钮事件点击事件监听,按钮是没有问题的 rac_signalForSelector
    [[_view rac_signalForSelector:@selector(btnAction)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"监听按钮点击事件");
    }];
#pragma 不能截取到
   //1、使用本身的视图进行监听是没有办法截取到自身的点击事件rac_signalForSelector
    [[_btn rac_signalForSelector:@selector(btnAction)] subscribeNext:^(RACTuple * _Nullable x) {
        NSLog(@"按钮监听");
    }];
#pragma 能截取到
    //1、截取button的点击事件的话就直接使用rac_signalForControlEvents
    [[_btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        NSLog(@"截取按钮点击事件");
    }];

}

-(void)btnAction
{
    NSLog(@"按钮点击事件");
    //1、可以截取到方法,则没有崩溃,现在若是没有截取到就会造成程序崩溃!
}
View Code

 


【注】说说感受:现在的理解就是,在玩RAC的时候,看了篇文章,上面讲解的时候,说明了其实本质上,RAC在拦截方法,类似于苹果CoreContext劫持方法,即苹果原生和JS互相调用的原理是一样的,因此特别注意了这个问题!

 

 

  1、当然现在还没有搞清楚为什么加在_View上面,但是截取到btnAction方法的时候,则直接跳到自己截取到的方法里面!假如没有截取到,就崩溃!说明在这边RAC截取方式就是通过类似于JS劫持的方式来拦截到调用方法的!

 

posted on 2017-06-23 10:14  OliverLance  阅读(111)  评论(0)    收藏  举报

导航