RAC的应用场景(取代代理,通知,KVO等)

一,取代代理:

场景:比如说在导航栏下有page1controller和page2controller,在page2controller 上的一个btn被点击的时候向上传递告诉page1controller

那么需要如下代码:

1,在page2controller的.h中定义如下RACSubject,暴漏给page1控制器:

@property (nonatomic, strong) RACSubject *subject;

2,page2controller的.m文件中懒加载RACSubject,并在点击按钮的时候发送信号数据,如下:

@implementation IMPage2ViewController
    
#pragma mark- lazy
- (RACSubject *)subject{
    if (_subject == nil) {
        _subject = [RACSubject subject];
    }
    return _subject;
}
    
    
- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)btnDidClicked:(id)sender {
    [self.subject sendNext:@"controller2向1传递数据"];
}
@end

3,在page1控制器中,通过prepareForSegue方法来订阅来自page2控制器的信号,如下:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    
    [super prepareForSegue:segue sender:sender];
    
    IMPage2ViewController *page2Controller = segue.destinationViewController;
    [page2Controller.subject subscribeNext:^(id x) {
        NSLog(@"接收到数据,数据内容是:%@",x);
    }];
}

注意:

另外如果不需要传递数据的情况下,只传递点击事件的时候这种方式还可以简化成一句代码:
上面1,2步骤中rac的所有代码均可以省略,只需要在page1控制器中监听page2控制器按钮点击方法然后转化成信号,直接添加订阅即可,如下:

1,在page2controller的.h中不用定义如下RACSubject,但是需要把点击事件方法暴漏给page1控制器:

//这里可以直接省略
//@property (nonatomic, strong) RACSubject *subject;
- (IBAction)btnDidClicked:(id)sender ;

2,page2controller的.m文件中也就不用懒加载RACSubject

@implementation IMPage2ViewController
    
#pragma mark- lazy
/*
- (RACSubject *)subject{
    if (_subject == nil) {
        _subject = [RACSubject subject];
    }
    return _subject;
}
*/
    
    
- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)btnDidClicked:(id)sender {
//这里只需要把方法实现一下即可,无需任何rac代码,但是需要把该方法在.h文件中暴漏出去
    //[self.subject sendNext:@"controller2向1传递数据"];
}
@end

3,在page1控制器中,通过prepareForSegue方法来订阅来自page2控制器的信号,如下:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    
    [super prepareForSegue:segue sender:sender];
    
    IMPage2ViewController *page2Controller = segue.destinationViewController;
    //方式二,不需要传递数据,只需要传递点击事件
    [[page2Controller rac_signalForSelector:@selector(btnDidClicked:)] subscribeNext:^(id x) {
        NSLog(@"利用方式二方式进行监听事件点击,方式二方便但是不能进行数据传递");
    }];
}

二,取代KVO

  • 系统KVO是通过监听属性改变,然后调用代理方法进行告知,如果说一个控制器需要监听多个属性改变,代理方法中就需要判断属性然后才能做出相应的操作,而RAC代替kvo直接是用block进行告知,可以直接在block中对属性进行相应的操作,实现代码的高聚合,如下:

  • 有两种取代方式:

1,第一种是直接监听,只能得到改变后的值,如下:

    [[self.view rac_valuesForKeyPath:@"frame" observer:self] subscribeNext:^(id x) {
        NSLog(@"监听到改变---%@",x);
    }];

//这个改变的时候输出结果是:NSRect: {{0, 0}, {500, 440}}

2,第二种是监听改变,如果option时new,得到一个元组,仍然是得不到旧值,如下

    [[self.view rac_valuesAndChangesForKeyPath:@"backgroundColor" options:NSKeyValueObservingOptionOld observer:self] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];

/*
    //输出结果是元组:

    //如果是NSKeyValueObservingOptionNew,只有新值,如下
     (
     "UIExtendedSRGBColorSpace 0 0 1 1",
     {
     kind = 1;
     new = "UIExtendedSRGBColorSpace 0 0 1 1";
     }
     )
     */
    //如果是NSKeyValueObservingOptionOld,结果中既有旧值,又有新值,如下
    /*
     (
     "UIExtendedSRGBColorSpace 0 0 1 1",
     {
     kind = 1;
     old = "UIExtendedSRGBColorSpace 1 1 1 1";
     }
     )
     */
    ```

  3,取代kvo高级用法:宏RACObserve

//RACObserve(<#TARGET#>, <#KEYPATH#>) 相当于 [TARGET rac_valuesForKeyPath:<#(NSString *)#> observer:<#(NSObject *__weak)#>]
[RACObserve(self.view, backgroundColor) subscribeNext:^(id x) {
    NSLog(@"%@", x);
}];
        

###三,取代addTarget监听
* 取代监听事件,比如自身的一个btn,通过block取代addTarget,不需要把点击事件相应操作放在另外方法中,实现高聚合,如下:

[[_btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
NSLog(@"按钮被点击");
}];


###四,取代通知方法

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

###五,监听文本框文字改变
[[_textField rac_textSignal] subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

//监听文字改变的高级宏用法(可以直接把监听到文字改变赋值给另外的控件)
RAC(self.label, text) = _textField.rac_textSignal;
    
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容