學(xué)習(xí)響應(yīng)式編程ReactiveCocoa

我們平常所常用到的響應(yīng)式編程有哪些:代理,通知骤宣,KVO玄叠,Block回調(diào)祸穷,Target,監(jiān)聽事件等
通過RAC我們可以更加簡(jiǎn)單的實(shí)現(xiàn)事件的方法,降低了代碼的耦合度停蕉,更方便管理
RAC的優(yōu)點(diǎn):減少代碼量愕鼓,可靈活使用

RAC常用的幾種用法:

KVO、textFiled慧起、button - taget - event菇晃、delegate、通知蚓挤、代替某個(gè)方法

RAC常用的高級(jí)用法:

過濾:filter谋旦、ignore、distinctUntilChanged屈尼、take册着、takeLast、takeUntil脾歧、takeWhileBlock甲捏、skip、switchToLatest
秩序:doNext鞭执、 docompleted
時(shí)間:retry司顿、interval芒粹、delay
重復(fù):retry、replay大溜、throttle
其他方法:startWith

RAC的重要概念:

RACSignal化漆、RACSubscriber、RACSubject

集成:

Objective-C:pod 'ReactiveCocoa', '2.1.8'
Swift:https://github.com/ReactiveCocoa

RAC: 信號(hào) 面向信號(hào)開發(fā)G辗堋座云!

1.創(chuàng)建信號(hào)!付材!

RACSubject *subject = [RACSubject subject];

2.誰(shuí)對(duì)信號(hào)感興趣朦拖,誰(shuí)訂閱信號(hào)(訂閱者)

[subject subscribeNext:^(id x) {
        NSLog(@"%@",x);//Hello RAC!!
    }];

3.我發(fā)送信號(hào)

[subject sendNext:@"Hello RAC!!"];

代理

常用方法

1.定義一個(gè)方法
2.定義協(xié)議方法
3.定義一個(gè)代理屬性(遵守這個(gè)協(xié)議)
4.當(dāng)發(fā)生一些事情,我看看代理屬性有沒有值
5.看看代理有沒有響應(yīng)我的方法厌衔!

使用代理

1.設(shè)置代理
2.遵守協(xié)議
3.實(shí)現(xiàn)方法

//HKView頁(yè)面
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];

-(void)btnClick:(UIButton *)send
{
    點(diǎn)擊事件的處理過程
}

RAC方法

    [[self.HkView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
        點(diǎn)擊事件的處理過程
    }];

代理傳值

//傳值頁(yè)面
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
-(void)btnClick:(UIButton *)send
{
    [self sendContent:@"今天真開心h档邸!"];
}

-(void)sendContent:(id)objc
{
    //可以什么都不做
}
//數(shù)據(jù)顯示和處理頁(yè)面
[[self.HkView rac_signalForSelector:@selector(sendContent:)]subscribeNext:^(id x) {
        NSLog(@"%@",x);//今天真開心
    }];

KVO

監(jiān)聽view的frame的變化

平時(shí)寫法

[self.hKView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
    NSLog(@"觀察到了");
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    self.hKView.frame = CGRectMake(100, 100, 50, 50);
}

其他實(shí)例
// RACObserve(TARGET, KEYPATH):KVO富寿,監(jiān)聽某個(gè)對(duì)象的屬性睬隶,返回的是信號(hào)。

第一步:[self NotificationCenter];

   第二步: [RACObserve(self.tabelView1, backgroundColor) subscribeNext:^(id  _Nullable x) {
        NSLog(@"self.view換了新背景顏色:%@",x);
    }];


第三步:-(void)NotificationCenter
{
    self.tabelView1.backgroundColor = [UIColor orangeColor];
}
    [RACObserve(_tabelView1, contentOffset)subscribeNext:^(id x) {
        //監(jiān)聽scrollview的滑動(dòng)
        NSLog(@"success:%@",x);
    }];
    //五秒后執(zhí)行一次,延時(shí)執(zhí)行
    [[RACScheduler mainThreadScheduler]afterDelay:5 schedule:^{
       
        NSLog(@"五秒后執(zhí)行一次");
        self.tabelView1.backgroundColor = [UIColor redColor];
        
    }];
    //每隔兩秒執(zhí)行一次
    //這里要加takeUntil條件限制一下否則當(dāng)控制器pop后依舊會(huì)執(zhí)行
    [[[RACSignal interval:2 onScheduler:[RACScheduler mainThreadScheduler]] takeUntil:self.rac_willDeallocSignal ] subscribeNext:^(id x) {

        NSLog(@"每?jī)擅雸?zhí)行一次");

    }];
}

RAC寫法

用來給某個(gè)對(duì)象的某個(gè)屬性綁定信號(hào)页徐,只要產(chǎn)生信號(hào)內(nèi)容理疙,就會(huì)將內(nèi)容賦值給屬性
//方法1:
[[self.hKView rac_valuesAndChangesForKeyPath:@"frame" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld observer:nil ]subscribeNext:^(id  _Nullable x) {
        NSLog(@"RAC觀察到了");
    }];
//方法2:
[[self.hKView rac_valuesForKeyPath:@"frame" observer:self]subscribeNext:^(id  _Nullable x) {
        NSLog(@"RAC觀察到了");
    }];
//方法3:
[RACObserve(self.hKView, frame) subscribeNext:^(id  _Nullable x) {
        NSLog(@"RAC觀察到了");
    }];
最大的好處是:當(dāng)需要觀察某個(gè)對(duì)象的某些屬性時(shí),簡(jiǎn)化了代碼泞坦,使代碼更好維護(hù)和閱讀

監(jiān)聽事件

常用寫法

UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];

-(void)btnClick:(UIButton *)send
{
   NSLog(@"今天真開心!砖顷!");
}

RAC寫法

//監(jiān)聽按鈕的點(diǎn)擊事件
[[btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
        NSLog(@"今天真開心7∷!");
    }];

通知

RAC通知傳值

//RAC通知
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//    在某個(gè)頁(yè)面中我們需要發(fā)出通知滤蝠,發(fā)送名為postdata的通知并傳送一個(gè)數(shù)組dataArray
    NSMutableArray *dataArray = [[NSMutableArray alloc] initWithObjects:@"1", @"2", @"3", nil];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"postData" object:dataArray];
}
//調(diào)用鍵盤的通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(id x) {
        //可處理鍵盤彈出時(shí)頁(yè)面布局問題等
    }];

UITextFiled

監(jiān)聽textFiled的輸入

文本框?qū)崟r(shí)的監(jiān)聽

[self.numTextF.rac_textSignal subscribeNext:^(NSString *x) {
          NSLog(@"文本框輸入的內(nèi)容:%@" ,x);
}];
[self.nameTextF.rac_newTextChannel subscribeNext:^(id  _Nullable x) {
        NSLog(@"輸出什么:%@",x);
    }];
    [[self.nameTextF rac_inputTextSignal]subscribeNext:^(id x) {
        
        NSLog(@"打印2:%@",x);
        
    }];
//RAC的實(shí)時(shí)賦值
RAC(_labe1, text) = _numTextF.rac_textSignal;

textFiled數(shù)字輸入監(jiān)聽

[self.numTextF.rac_textSignal subscribeNext:^(NSString *x) {
        
        static NSInteger const maxIntegerLength=8;//最大整數(shù)位
        static NSInteger const maxFloatLength=2;//最大精確到小數(shù)位
        
        if (x.length) {
            //第一個(gè)字符處理
            //第一個(gè)字符為0,且長(zhǎng)度>1時(shí)
            if ([[x substringWithRange:NSMakeRange(0, 1)] isEqualToString:@"0"]) {
                if (x.length>1) {
                    if ([[x substringWithRange:NSMakeRange(1, 1)] isEqualToString:@"0"]) {
                        //如果第二個(gè)字符還是0,即"00",則無(wú)效,改為"0"
                        self.numTextF.text=@"0";
                    }else if (![[x substringWithRange:NSMakeRange(1, 1)] isEqualToString:@"."]){
                        //如果第二個(gè)字符不是".",比如"03",清除首位的"0"
                        self.numTextF.text=[x substringFromIndex:1];
                    }
                }
            }
            //第一個(gè)字符為"."時(shí),改為"0."
            else if ([[x substringWithRange:NSMakeRange(0, 1)] isEqualToString:@"."]){
                self.numTextF.text=@"0.";
            }
            
            //2個(gè)以上字符的處理
            NSRange pointRange = [x rangeOfString:@"."];
            NSRange pointsRange = [x rangeOfString:@".."];
            if (pointsRange.length>0) {
                //含有2個(gè)小數(shù)點(diǎn)
                self.numTextF.text=[x substringToIndex:x.length-1];
            }
            else if (pointRange.length>0){
                //含有1個(gè)小數(shù)點(diǎn)時(shí),并且已經(jīng)輸入了數(shù)字,則不能再次輸入小數(shù)點(diǎn)
                if ((pointRange.location!=x.length-1) && ([[x substringFromIndex:x.length-1]isEqualToString:@"."])) {
                    self.numTextF.text=[x substringToIndex:x.length-1];
                }
                if (pointRange.location+maxFloatLength<x.length) {
                    //輸入位數(shù)超出精確度限制,進(jìn)行截取
                    self.numTextF.text=[x substringToIndex:pointRange.location+maxFloatLength+1];
                }
            }
            else{
                if (x.length>maxIntegerLength) {
                    self.numTextF.text=[x substringToIndex:maxIntegerLength];
                }
            }
            
        }
        
    }];

監(jiān)聽輸入字體個(gè)數(shù)的簡(jiǎn)單處理

//監(jiān)聽輸入字體個(gè)數(shù)
    NSInteger maxLenght = 10;
    [[self.nameTextF.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
        return value.length > maxLenght;
    }] subscribeNext:^(NSString * _Nullable x) {
//        NSLog(@"最多輸入10個(gè)文字");
        self.nameTextF.text = [self.nameTextF.text substringToIndex:maxLenght];
    }];

未完待續(xù)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豌熄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子物咳,更是在濱河造成了極大的恐慌锣险,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件览闰,死亡現(xiàn)場(chǎng)離奇詭異芯肤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)压鉴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門崖咨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人油吭,你說我怎么就攤上這事击蹲∈鹉猓” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵歌豺,是天一觀的道長(zhǎng)推穷。 經(jīng)常有香客問我,道長(zhǎng)类咧,這世上最難降的妖魔是什么馒铃? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮轮听,結(jié)果婚禮上骗露,老公的妹妹穿的比我還像新娘。我一直安慰自己血巍,他們只是感情好萧锉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著述寡,像睡著了一般柿隙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鲫凶,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天禀崖,我揣著相機(jī)與錄音,去河邊找鬼螟炫。 笑死波附,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昼钻。 我是一名探鬼主播掸屡,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼然评!你這毒婦竟也來了仅财?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤碗淌,失蹤者是張志新(化名)和其女友劉穎盏求,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿眠,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碎罚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纳像。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魂莫。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖爹耗,靈堂內(nèi)的尸體忽然破棺而出耙考,到底是詐尸還是另有隱情谜喊,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布倦始,位于F島的核電站斗遏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鞋邑。R本人自食惡果不足惜诵次,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枚碗。 院中可真熱鬧逾一,春花似錦、人聲如沸肮雨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)怨规。三九已至陌宿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間波丰,已是汗流浹背壳坪。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掰烟,地道東北人爽蝴。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纫骑,于是被迫代替她去往敵國(guó)和親蝎亚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容