華山論劍之淺談iOS中的百變金剛---ReactiveCocoa

人生如戲,全靠演技.



對于ReactiveCocoa的安裝,最便捷的方法無疑是CocoaPods,關(guān)于CocoaPods的使用,我的文章中曾經(jīng)提到過.所以我們就看一下ReactiveCocoa是如何使用CocoaPods安裝的.


ReactiveCocoa的安裝


首先我們要先安裝CocoaPods,這里就不說了,給大家一個關(guān)于CocoaPods的鏈接

---> 華山論劍之淺談iOS第三方終結(jié)者CocoaPods

安裝CocoaPods完成之后,然后使用下面的終端語句查找ReactiveCocoa.

pod search ReactiveCocoa

然后,我們就需要創(chuàng)建我們的Demo文件,然后cd 這個文件夾.就是在終端輸入如下格式的指令;

cd + "空格" + "文件路徑"

然后,我們就需要創(chuàng)建一個Podfile文件,輸入如下的指令

touch Podfile

這時候我們就要對我們Podfile文件進(jìn)行ReactiveCocoa第三方類的下載設(shè)置,兩種方法,一種是輸入下面的終端指令,在終端進(jìn)行輸入,另外一種是我們打開我們的Podfile文件輸入.

vim Podfile

輸入的信息如下,因為我們是用OC的最新版本 所以就是2.5版本.

platform :ios, '7.0'
pod "ReactiveCocoa", "~>2.5"

輸入完成之后,我們就需要保存,所以要輸入保存指令.先Esc一下,然后輸入如下指令回車

:wq

這時候我們就需要下載ReactiveCocoa了.還是在終端中的當(dāng)前項目目錄下,運行以下命令.

pod install

下載完成之后,我們要打開那個帶有ReactiveCocoa的Xcode.

ReactiveCocoa的功能


在說所有的功能之前,我要先說一下ReactiveCocoa的通俗說法.每一行代碼幾乎都是在相應(yīng)某個事件托酸,例如按鈕的點擊存皂,收到網(wǎng)絡(luò)消息,屬性的變化(通過KVO)或者用戶位置的變化(通過CoreLocation)。但是這些事件都用不同的方式來處理罩锐,比如action骄瓣、delegate、KVO胖眷、callback等。ReactiveCocoa為事件定義了一個標(biāo)準(zhǔn)接口霹崎,從而可以使用一些基本工具來更容易的連接瘦材、過濾和組合。

上面可能說的可能對大多數(shù)初學(xué)ReactiveCocoa的人不太清楚,你可以想象ReactiveCocoa的一個相應(yīng)事件就是水龍頭,水龍頭需要中有水(其實官方的說法就是消息 ),然后水龍頭需要一個開關(guān),并且水龍頭需要下面需要一個容器接水. ReactiveCocoa可以替代的東西很多,今天我就介紹簡單介紹一下ReactiveCocoa替換代理/KVO ,謂詞,映射/改變,廣播/通知中心.

這里我在ViewController中做一些ReactiveCocoa功能的描述.讓我們一起見證ReactiveCocoa的強大之處之前,我們首先要先導(dǎo)入ReactiveCocoa的庫.

#import <ReactiveCocoa/ReactiveCocoa.h>


代理/KVO


我們在main.storyboard里面做一個textfield,然后在ViewController聲明成屬性.

代碼解釋 :self.myTextField的text的值相當(dāng)于水龍頭中的水.rac_textSignal相當(dāng)于水龍頭開關(guān). subscribeNext:這個方法就相當(dāng)于接水的容器.當(dāng)水符合水龍頭的要求的時候 ,水就會流出來.其實通過這里我們就可以看出,ReactiveCocoa是一個消息機(jī)制,self.myTextField.rac_textSignal整一個是個消息,當(dāng)有消息的時候就會調(diào)用subscribeNext,這樣就代替了KVO,每當(dāng)myTextField的值發(fā)生改變的時候,都會發(fā)出消息.
[self.myTextField.rac_textSignal subscribeNext:^(id x) {
        
        NSLog(@"%@",x);
        
    }];

我們看一下輸入一段字符串,然后刪除會有什么效果.



謂詞


我們可以使用ReactiveCocoa來達(dá)到謂詞的篩選效果..

代碼解釋:根據(jù)上一個模塊說到ReactiveCocoa可以代替KVO,可是當(dāng)我們需要篩選一些不許的數(shù)據(jù)的時候,我們應(yīng)該怎么做呢?代碼如下,我們是使用ReactiveCocoa的一個方法filter.然后返回篩選條件,就能對我們的消息中的值進(jìn)行篩選再輸出了.
  [[self.myTextField.rac_textSignal filter:^BOOL(NSString * value) {
        
        return value.length >3 ;
        
    }] subscribeNext:^(id x) {
        NSLog(@"%@",x);
    }];
    

我們看一下控制臺輸出的結(jié)果吧.控制臺只會從length長度大于3開始輸出.起到了謂詞的效果.


映射


我們可以使用ReactiveCocoa來達(dá)到映射的效果..

代碼解釋: ReactiveCocoa的map方法就是起到了映射的效果.
    [[[self.myTextField.rac_textSignal map:^id(NSString * value) {
        
        return @(value.length);
    }] filter:^BOOL(NSNumber *value) {
        
        return [value integerValue]>3;
    }] subscribeNext:^(id x) {
        
        
        NSLog(@"%@",x);
    }];

那么加上映射的輸出結(jié)果又是如何呢?如下


廣播


我們可以使用ReactiveCocoa來達(dá)到通知中心的效果.

代碼解釋:通知使用 ReactiveCocoa 也是能夠代替的.而且使用ReactiveCocoa做廣播的時候,不需要我們delloc我們的通知中心的觀察者.
 //添加通知中心
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"dongGe" object:nil] subscribeNext:^(id x) {
        
        NSLog(@"吼吼!!");
        
    }];
    
    //發(fā)送消息
    [[NSNotificationCenter defaultCenter] postNotificationName:@"dongGe" object:nil];

</br>

自定義信號


如果上面的案例不能滿足我們的需求怎么辦?這時候我們就需要自定義信號了.

代碼解釋:首先我們先創(chuàng)建三個小管道. switchSinal就是開關(guān),然后就是鋪設(shè)管道,鋪設(shè)完之后我們就需要往其中注水.然后就會從管道中流出.
 
    //1.關(guān)鍵字
    RACSubject *dongGe = [RACSubject subject];
    
    RACSubject *maincode = [RACSubject subject];
    
    RACSubject *signalOfSignal = [RACSubject subject];
    
    //2.開關(guān)是怎么設(shè)置的
    RACSignal * switchSinal = [signalOfSignal switchToLatest];
    
    //鋪設(shè)管道.
    [switchSinal subscribeNext:^(id x) {
       
        NSLog(@"%@",x);
        
    }];
    
    //3.為信號添加數(shù)據(jù)
    [signalOfSignal sendNext:dongGe];
    
    [dongGe sendNext:@"dongGe"];
    
    [signalOfSignal sendNext:maincode];
    
    [maincode sendNext:@"www.maincode.com"];


總結(jié):ReactiveCocoa總體上來說是一個很強大的類庫,雖然抽象比較難理解,但是當(dāng)我們真正理解它的時候,你就會發(fā)現(xiàn)它其實很強大.所以學(xué)習(xí)他是一種必然,但愿我這篇文章能對您有所幫助.謝謝.??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仿畸,一起剝皮案震驚了整個濱河市食棕,隨后出現(xiàn)的幾起案子朗和,更是在濱河造成了極大的恐慌,老刑警劉巖簿晓,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眶拉,死亡現(xiàn)場離奇詭異,居然都是意外死亡憔儿,警方通過查閱死者的電腦和手機(jī)忆植,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谒臼,“玉大人朝刊,你說我怎么就攤上這事◎阽停” “怎么了拾氓?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長底哥。 經(jīng)常有香客問我咙鞍,道長,這世上最難降的妖魔是什么趾徽? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任续滋,我火速辦了婚禮,結(jié)果婚禮上孵奶,老公的妹妹穿的比我還像新娘疲酌。我一直安慰自己,他們只是感情好了袁,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布朗恳。 她就那樣靜靜地躺著,像睡著了一般早像。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肖爵,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天卢鹦,我揣著相機(jī)與錄音,去河邊找鬼劝堪。 笑死冀自,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的秒啦。 我是一名探鬼主播熬粗,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼余境!你這毒婦竟也來了驻呐?” 一聲冷哼從身側(cè)響起灌诅,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎含末,沒想到半個月后猜拾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡佣盒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年挎袜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肥惭。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡盯仪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜜葱,到底是詐尸還是另有隱情全景,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布笼沥,位于F島的核電站蚪燕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奔浅。R本人自食惡果不足惜馆纳,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汹桦。 院中可真熱鬧鲁驶,春花似錦、人聲如沸舞骆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽督禽。三九已至脆霎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狈惫,已是汗流浹背睛蛛。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留胧谈,地道東北人忆肾。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像菱肖,于是被迫代替她去往敵國和親客冈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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