人生如戲,全靠演技.
對于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í)他是一種必然,但愿我這篇文章能對您有所幫助.謝謝.??