?最近接觸學(xué)習(xí)到了RAC(ReactiveCocoa),RAC是函數(shù)式+響應(yīng)式編程結(jié)合乃正,首先得去理解何為響應(yīng)式函數(shù)編程(FRP)瓮具。
? ? 看了許多介紹,舉一個(gè)最通俗易懂的例子——在命令式編程環(huán)境中兑巾, a = b+c表示將表達(dá)式的結(jié)果賦給 a,而之后改變 b 或 c的值不會(huì)影響 a忠荞。但在響應(yīng)式編程中蒋歌,a的值會(huì)隨著 b或 c的更新而更新帅掘,意味著聲明了一種綁定關(guān)系,b堂油、c的變化會(huì)直接影響到a修档。
? ? 之前在iOS工作中,類之間的傳值府框,無非就是block吱窝、delegate代理、KVO迫靖、notification這幾種方法。在RAC中,同樣具備替代KVO、delegate代理口柳、通知俺孙、UI target场靴、計(jì)時(shí)器timer轨帜、數(shù)據(jù)結(jié)構(gòu)等各種方法苟弛。依據(jù)響應(yīng)式函數(shù)編程,RAC方法本身更加簡潔明了,通過提供信號(hào)的方式(RACSignal)可以捕捉當(dāng)前以及未來的屬性值變化,而且無需持續(xù)觀察和更新代碼劝篷。可直接在block中將邏輯代碼加入其中,使得代碼緊湊,更加直觀。
? ? 先來介紹ObjC版本兼贡,使用cocoaPods在podfile中添加 pod 'ReactiveObjC', '~> 3.1.0' 涉兽,然后pod install一下拥诡。在項(xiàng)目中#import <ReactiveObjC.h>,建議放入pch頭文件中乌奇。
? ? 通過RAC提供的方法與系統(tǒng)提供的方法分別進(jìn)行對(duì)比,先來感受下RAC的強(qiáng)大之處。
1. UIButton
在RAC的block代碼塊中,打印x的屬性為當(dāng)前self.testButton的相關(guān)信息。
2. KVO
KVO在使用時(shí),必須在- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context中實(shí)現(xiàn)針對(duì)KVO監(jiān)聽屬性值變化的處理浦译,而且對(duì)于KeyPath書寫容易產(chǎn)生手寫錯(cuò)誤。在對(duì)應(yīng)類dealloc時(shí),KVO還必須要進(jìn)行remove操作籽前,否則會(huì)程序crash
在使用RAC代替KVO時(shí)蓖宦,不僅能大大增加代碼可讀性电爹,而且RACObserve(<#TARGET#>, <#KEYPATH#>)宏定義中keyPath可以代碼提示出target中的屬性成員變量法梯,降低手寫代碼錯(cuò)誤的可能性铛绰。
3. delegate代理
以UITextField為例,當(dāng)需要對(duì)UITextField邏輯處理時(shí),往往需要實(shí)現(xiàn)其各類代理方法,大大增加了代碼量唯蝶。當(dāng)使用RAC之后
@selector方法選擇器中鍵入要實(shí)現(xiàn)的代理方法,代理名稱聲明為對(duì)應(yīng)的代理名稱。block代碼塊中,當(dāng)觸發(fā)監(jiān)聽的代理方法時(shí)返回元組類型數(shù)據(jù)填渠,與swift中的元組類型有所區(qū)別屉更,此處的元組看起來更像是數(shù)組徙融。
4. Notification通知
5. 定時(shí)器timer
6. 數(shù)組與字典
遍歷元素
RAC基本使用方法與流程
????以上代碼中瑰谜,subscribeNext作用為訂閱信號(hào)欺冀,可在該block中輸入邏輯相關(guān)代碼塊。但當(dāng)多個(gè)對(duì)象的邏輯存在于block中需要修改時(shí)萨脑,僅僅subscribeNext已不能滿足需求隐轩。
RAC中信號(hào)的其它動(dòng)作:
信號(hào)映射:map、flattenMap
信號(hào)過濾:filter渤早、ignore职车、distinctUntilChanged
信號(hào)合并:combineLatest、reduce、merge悴灵、zipWith
信號(hào)連接:concat扛芽、then
信號(hào)操作時(shí)間:timeout、interval积瞒、dely
信號(hào)跳過:skip
信號(hào)取值:take川尖、takeLast、takeUntil
信號(hào)發(fā)送順序:donext茫孔、cocompleted
獲取信號(hào)中的信號(hào):switchToLatest
信號(hào)錯(cuò)誤重試:retry
? ? 在實(shí)際開發(fā)過程中叮喳,需要在RAC代碼塊中添加邏輯代碼,避免不了引用當(dāng)前類中的成員變量缰贝,那么需要在RAC方法外部寫入以下代碼:
@weakify(self)
? ? 在RAC的block代碼塊內(nèi)部寫入:
@strongify(self)
以此來避免出現(xiàn)block的循環(huán)引用馍悟,至于為何要如此聲明,稍后會(huì)在后續(xù)文章中一一說明揩瞪。
????稍后會(huì)在后續(xù)的文章里繼續(xù)介紹如何使用赋朦,以及RAC信號(hào)流程原理。demo代碼放到GitHub上demo鏈接