RAC自己練習(xí)下

ReactiveCocoa使用個人總結(jié)

ReactiveCocoa簡介

ReactiveCocoa(簡稱RAC)是由Github開源的一個應(yīng)用于iOS和OS開發(fā)的新框架砌滞。

ReactiveCocoa的作用

在我們iOS開發(fā)過程中,當(dāng)某些事件響應(yīng)的時候贝润,需要處理某些業(yè)務(wù)邏輯,這些事件都會用不同的方式來處理按傅。比如:按鈕的點擊使用action胧卤、UIScrollView的滾動使用的delegate、監(jiān)測屬性的值改變使用KVO等系統(tǒng)提供的方式枝誊。

RAC就是把這些不同的響應(yīng)事件的方式統(tǒng)一起來,使這些方式都可以通過RAC來處理绝骚。

RAC為事件提供了很多的處理方法祠够,而且利用RAC來處理事件很方便,可以把要處理的事情和監(jiān)聽的代碼放一起止剖,方便我們的管理落君,這樣就不需要跳轉(zhuǎn)到對應(yīng)的方法里去處理,非常符合我們開發(fā)中高內(nèi)聚绎速,低耦合的思想。

RAC在某些特定情況下開發(fā)時可以大大簡化代碼洒宝,提高開發(fā)效率,并且是安全可靠的雁歌。

配置RAC環(huán)境

使用cocoapods來獲取github上的開源庫:

pod 'ReactiveCocoa'

如何使用RAC

  • RACSignal

信號類,一般表示將來會有數(shù)據(jù)傳遞,只要數(shù)據(jù)改變橡庞,信號內(nèi)部接收到數(shù)據(jù)扒最,就會馬上發(fā)出數(shù)據(jù)。

  • RACSignal只是表示當(dāng)數(shù)據(jù)改變時吧趣,信號內(nèi)部會發(fā)出數(shù)據(jù),他本身不具備發(fā)送信號的能力岔霸,而是交給內(nèi)部的一個訂閱者subscriber發(fā)出俯渤。
  • 默認一個信號都是冷信號,也就是說值改變了也不會觸發(fā)八匠,只有訂閱了這個信號,值改變了才會觸發(fā)坑夯。
  • 訂閱信號:調(diào)用RACSignal的subscribeNext:方法就可以訂閱信號抡四。
    // 創(chuàng)建一個RACSignal信號
    RACSignal * signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
                  // 每當(dāng)有訂閱者訂閱信號  就會調(diào)用這個block
                  // 發(fā)送信號
                  [subscriber sendNext:@"Hello"];
                  // 如果不再發(fā)送數(shù)據(jù),最好調(diào)用此方法發(fā)送信號完成
                  [subscriber sendCompleted];
                  return [RACDisposable disposableWithBlock:^{
                        // 當(dāng)信號發(fā)送完成或者發(fā)送錯誤跨释,就會自動執(zhí)行這個block厌处,取消訂閱信號
                        NSLog(@"信號被銷毀");
            }];
    }];
    
    // 訂閱信號,才會激活信號
    [signal subscribeNext:^(id x){
        // 每當(dāng)有信號發(fā)出數(shù)據(jù)  就會調(diào)用block
        NSLog(@"接收到數(shù)據(jù)%@",x);
    }]

  • target-action

RAC最基本的使用就是對事件的監(jiān)聽缆娃。我們來看以下代碼:

RACSignal * textFieldSignal = [textField rac_signalForControlEvents:UIControlEventEditingChanged];
[textFieldSignal subscribeNext:^(id x) {
        NSLog(@"變化的text:%@",x);
}];

這段代碼實現(xiàn)了監(jiān)聽UITextFieldUIControlEventEditingChanged事件,當(dāng)textField里的內(nèi)容發(fā)生變化時贯要,發(fā)送變化的數(shù)據(jù)調(diào)用block種的內(nèi)容將變化的內(nèi)容實時打印出來。這兩段代碼通常會連在一起寫:

[[textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x) {
        NSLog(@"變化的text:%@",x);
    }];

同樣的字逗,我們以這段代碼為模板進行RAC的使用宅广,UIButton的點擊事件我們也可以用RAC進行監(jiān)測,添加方法俭厚,對于UITextField的文字更改的監(jiān)聽也有更簡單的寫法:

// UIButton添加RAC監(jiān)聽點擊方法
[[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
        NSLog(@"點擊button:%@",x);
}];
// 對于UITextField 文字更改的監(jiān)聽
[textField.rac_textSignal subscribeNext:^(id x) {
        NSLog(@"變化的text:%@",x);
}]

RAC的一些常見操作方法

  1. ReactiveCocoa操作方法之映射(flattenMap驶臊,Map)

    • flattenMap,Map用于把源信號內(nèi)容映射成新的內(nèi)容。

    flattenMap的使用:把源信號的內(nèi)容映射成一個新的信號关翎,信號可以是任意類型 flattenMap中的block返回的是信號

```
// 創(chuàng)建信號中的信號

RACSubject * signalOfSignals = [RACSubject subject];
RACSubject * signals = [RACSubject subject];

[[signalOfSignals flattenMap:^RACStream *(id value) {
    // 當(dāng)signalOfsignals 發(fā)出signals 信號才會調(diào)用  這里的value返回的是信號
    return value;
}] subscribeNext:^(id x) {
    // 只有signalOfSignals發(fā)出的signals也發(fā)出了內(nèi)容(也就是最后一行代碼執(zhí)行)才會調(diào)用
    NSLog(@"=========>%@",x);
}];

// 信號中的信號發(fā)送一個信號
[signalOfSignals sendNext:signals];
// 信號發(fā)送一個內(nèi)容
[signals sendNext:@"信號發(fā)送信號"];

```

> map的使用:把源信號的值映射成一個新的值纵寝,`map`中的block返回的是一般對象(這里一般用于把源信號里的json數(shù)據(jù)映射成相應(yīng)的model)

```
// 監(jiān)聽文本框內(nèi)容的改變,映射成一個新的值
[[textField.rac_textSignal map:^id(id value) {
    // 這里是把文本框的內(nèi)容加上 “Hello RAC” 的前綴
    return [NSString stringWithFormat:@"Hello RAC :%@",value];
}] subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];
```

> 開發(fā)中店雅,如果信號發(fā)出的不是信號闹啦,映射一般使用`map`,如果信號發(fā)出的是信號窍奋,則使用`flattenMap`。
  1. ReactiveCocoa操作方法之組合

    • concat:按一定順序拼接信號江场,當(dāng)多個信號發(fā)出的時候窖逗,有順序的接收信號
     RACSignal * signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"First"];
        [subscriber sendCompleted];
        return nil;
    }];
    
    RACSignal * signalB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        [subscriber sendNext:@"Second"];
        [subscriber sendCompleted];
        return nil;
    }];
    
    // 把A拼接到B后   A發(fā)送完成B才會被激活  按順序
    RACSignal * concatSignal = [signalA concat:signalB];
    [concatSignal subscribeNext:^(id x) {
        NSLog(@"Concat Signal %@",x);
    }];
    
    • then:用于連接兩個信號,當(dāng)?shù)谝粋€信號完成碎紊,才會連接then返回的信號樊诺,第一個信號會被忽略掉音同。
     RACSignal * thenSignal = [signalA then:^RACSignal *{
        return signalB;
    }];
    
    [thenSignal subscribeNext:^(id x) {
        // 此處輸出為 Then signal Second   第一個信號會被忽略掉
        NSLog(@"Then signal %@",x);
    }];
    
    • merge把多個信號合并為一個信號权均,任何一個信號有新值就會調(diào)用。
    RACSignal * mergeSignal = [signalA merge:signalB];
    [mergeSignal subscribeNext:^(id x) {
        NSLog(@"Merge Signal %@",x);
    }];
    
    • zipWith:用于把兩個信號壓縮成一個信號叽赊,只有兩個信號都發(fā)出信號內(nèi)容時,把兩個信號的內(nèi)容合并成一個元組芽唇,才會觸發(fā)壓縮流的next事件取劫。
    RACSignal * zipWithSignal = [signalA zipWith:signalB];
    [zipWithSignal subscribeNext:^(id x) {
        NSLog(@"ZipWith Signal %@",x);
    }];
    
    • combineLatest:將多個信號合并起來研侣,并且拿到各個信號的最新的值,必須每個合并的signal至少都有過一次sendNext庶诡,才會觸發(fā)合并的信號。這個方法試了一下扯俱,覺得跟zipWith是相似的喇澡。
    RACSignal * combineSignal = [signalA combineLatestWith:signalB];
    [combineSignal subscribeNext:^(id x) {
        NSLog(@"Combine Signal %@",x);
    }];
    
    • reduce:聚合:用于信號發(fā)出的內(nèi)容是元組,把信號發(fā)出元組的值聚合成一個值
    // 常見的方法(先組合再聚合)读存。
    // 先組合再聚合呕屎,把上面兩個信號聚合在一起。形成一個信號  (兩者都成立才為yes)
    // 用于登錄頁面秀睛,兩個文本框的內(nèi)容都符合條件,登錄按鈕才會響應(yīng)
        RACSignal * reduceSignal = [RACSignal combineLatest:@[usernameLengthSignal, passwordLengthSignal] reduce:^id(NSNumber * username , NSNumber * password){
            return @(username.boolValue && password.boolValue);
        }];
        
    

RAC一些常用的宏

  1. RAC()居凶,這個宏的完整寫法是:RAC(TARGET,[KEYPATH,NIL_VALUE])

    使用方法:

     RAC(label,text) = self.textField.rac_textSignal;
     RAC(label,text,@"如果是nil就顯示這里的文字") = self.textField.rac_textSignal;
    

    最常用的宏RAC()一般出現(xiàn)在等號左邊,右邊是一個RACSignal抹估,作用是將一個對象(這里是label)的一個屬性(這里是label的text)和一個RACSignal綁定弄兜,RACSignal每產(chǎn)生一個value,都會自動將這個對象的這個屬性設(shè)置為value替饿。如果value是nil,就設(shè)置為第三個參數(shù)踱卵。(上面的代碼的效果是把label的text和textField的文字變動的signal綁定据过, 每當(dāng)textField里面的文字有變化,就給label設(shè)置新的text绳锅。)

  2. RACObserve(TARGET,KEYPATH)

    作用是觀察TARGET的KEYPATH屬性,產(chǎn)生一個RACSignal眷柔,相當(dāng)于KVO原朝。

    RAC(self.outputLabel, text) = RACObserve(self.model, name); 
    

    把label的text和model的name綁定,只要name有變化喳坠,label的text也會變化為相應(yīng)的值。

暫時寫這么點吧谢澈。 代碼點擊這里.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末御板,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子敬鬓,更是在濱河造成了極大的恐慌,老刑警劉巖钉答,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件数尿,死亡現(xiàn)場離奇詭異,居然都是意外死亡右蹦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門晨汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贷盲,“玉大人,你說我怎么就攤上這事巩剖÷燎睿” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵球及,是天一觀的道長氧骤。 經(jīng)常有香客問我呻疹,道長吃引,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任刽锤,我火速辦了婚禮镊尺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘并思。我一直安慰自己,他們只是感情好宋彼,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布弄砍。 她就那樣靜靜地躺著,像睡著了一般输涕。 火紅的嫁衣襯著肌膚如雪音婶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天莱坎,我揣著相機與錄音衣式,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛碴卧,可吹牛的內(nèi)容都是我干的弱卡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼住册,長吁一口氣:“原來是場噩夢啊……” “哼婶博!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起荧飞,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤凡蜻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后垢箕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體划栓,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年条获,在試婚紗的時候發(fā)現(xiàn)自己被綠了忠荞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡帅掘,死狀恐怖委煤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情修档,我是刑警寧澤碧绞,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站吱窝,受9級特大地震影響讥邻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜院峡,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一兴使、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧照激,春花似錦发魄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至口柳,卻和暖如春苹粟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啄清。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工六水, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俺孙,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓掷贾,卻偏偏與公主長得像睛榄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子想帅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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

  • 1.ReactiveCocoa常見操作方法介紹场靴。 1.1 ReactiveCocoa操作須知 所有的信號(RACS...
    萌芽的冬天閱讀 1,018評論 0 5
  • RAC使用測試Demo下載:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees閱讀 6,359評論 3 10
  • 前言 很多blog都說ReactiveCocoa好用,然后各種秀自己如何靈活運用ReactiveCocoa港准,但是感...
    RainyGY閱讀 1,325評論 0 1
  • 前言由于時間的問題旨剥,暫且只更新這么多了,后續(xù)還會持續(xù)更新本文《最快讓你上手ReactiveCocoa之進階篇》浅缸,目...
    Karos_凱閱讀 1,731評論 0 6
  • 秋意濃轨帜。 今天突然降溫了,中午下起了密密綿綿的秋雨衩椒。沒有打傘走過了公園蚌父,不象是在淋雨,行走在若有是無的雨霧中毛萌,感覺...
    何偀閱讀 269評論 0 1