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

人生如戲,全靠演技.



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


ReactiveCocoa的安裝


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

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

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

pod search ReactiveCocoa

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

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

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

touch Podfile

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

vim Podfile

輸入的信息如下,因?yàn)槲覀兪怯肙C的最新版本 所以就是2.5版本.

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

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

:wq

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

pod install

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

ReactiveCocoa的功能


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

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

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

#import <ReactiveCocoa/ReactiveCocoa.h>


代理/KVO


我們?cè)趍ain.storyboard里面做一個(gè)textfield,然后在ViewController聲明成屬性.

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

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



謂詞


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

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

我們看一下控制臺(tái)輸出的結(jié)果吧.控制臺(tái)只會(huì)從length長(zhǎng)度大于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做廣播的時(shí)候,不需要我們delloc我們的通知中心的觀察者.
 //添加通知中心
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"dongGe" object:nil] subscribeNext:^(id x) {
        
        NSLog(@"吼吼!!");
        
    }];
    
    //發(fā)送消息
    [[NSNotificationCenter defaultCenter] postNotificationName:@"dongGe" object:nil];

</br>

自定義信號(hào)


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

代碼解釋:首先我們先創(chuàng)建三個(gè)小管道. switchSinal就是開關(guān),然后就是鋪設(shè)管道,鋪設(shè)完之后我們就需要往其中注水.然后就會(huì)從管道中流出.
 
    //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.為信號(hào)添加數(shù)據(jù)
    [signalOfSignal sendNext:dongGe];
    
    [dongGe sendNext:@"dongGe"];
    
    [signalOfSignal sendNext:maincode];
    
    [maincode sendNext:@"www.maincode.com"];


總結(jié):ReactiveCocoa總體上來說是一個(gè)很強(qiáng)大的類庫,雖然抽象比較難理解,但是當(dāng)我們真正理解它的時(shí)候,你就會(huì)發(fā)現(xiàn)它其實(shí)很強(qiáng)大.所以學(xué)習(xí)他是一種必然,但愿我這篇文章能對(duì)您有所幫助.謝謝.??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容