?最近接觸學習到了RAC(ReactiveCocoa)镇饺,RAC是函數(shù)式+響應式編程結(jié)合,首先得去理解何為響應式函數(shù)編程(FRP)奸笤。
? ? 看了許多介紹惋啃,舉一個最通俗易懂的例子——在命令式編程環(huán)境中边灭, a = b+c表示將表達式的結(jié)果賦給 a,而之后改變 b 或 c的值不會影響 a健盒。但在響應式編程中绒瘦,a的值會隨著 b或 c的更新而更新,意味著聲明了一種綁定關系扣癣,b惰帽、c的變化會直接影響到a。
? ? 之前在iOS工作中父虑,類之間的傳值该酗,無非就是block、delegate代理士嚎、KVO呜魄、notification這幾種方法。在RAC中航邢,同樣具備替代KVO耕赘、delegate代理、通知膳殷、UI target操骡、計時器timer、數(shù)據(jù)結(jié)構(gòu)等各種方法赚窃。依據(jù)響應式函數(shù)編程册招,RAC方法本身更加簡潔明了,通過提供信號的方式(RACSignal)可以捕捉當前以及未來的屬性值變化勒极,而且無需持續(xù)觀察和更新代碼是掰。可直接在block中將邏輯代碼加入其中辱匿,使得代碼緊湊键痛,更加直觀。
? ? 先來介紹ObjC版本匾七,使用cocoaPods在podfile中添加 pod 'ReactiveObjC', '~> 3.1.0' 絮短,然后pod install一下。在項目中#import <ReactiveObjC.h>昨忆,建議放入pch頭文件中丁频。
? ? 通過RAC提供的方法與系統(tǒng)提供的方法分別進行對比,先來感受下RAC的強大之處。
1. UIButton
通過默認的Target-action創(chuàng)建點擊動作
RAC創(chuàng)建Button點擊事件與添加點擊手勢動作
在RAC的block代碼塊中席里,打印x的屬性為當前self.testButton的相關信息叔磷。
2. KVO
KVO在使用時,必須在- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context中實現(xiàn)針對KVO監(jiān)聽屬性值變化的處理奖磁,而且對于KeyPath書寫容易產(chǎn)生手寫錯誤。在對應類dealloc時寥裂,KVO還必須要進行remove操作案疲,否則會程序crash
使用KVO監(jiān)聽UILable的text屬性變化
在使用RAC代替KVO時褐啡,不僅能大大增加代碼可讀性鳖昌,而且RACObserve(<#TARGET#>, <#KEYPATH#>)宏定義中keyPath可以代碼提示出target中的屬性成員變量许昨,降低手寫代碼錯誤的可能性霜第。
使用RAC代替KVO監(jiān)聽屬性變化
3. delegate代理
以UITextField為例衩椒,當需要對UITextField邏輯處理時桌吃,往往需要實現(xiàn)其各類代理方法劳淆,大大增加了代碼量理逊。當使用RAC之后
使用RAC代替delegate實現(xiàn)方法
@selector方法選擇器中鍵入要實現(xiàn)的代理方法捶惜,代理名稱聲明為對應的代理名稱。block代碼塊中吱七,當觸發(fā)監(jiān)聽的代理方法時返回元組類型數(shù)據(jù),與swift中的元組類型有所區(qū)別鹤竭,此處的元組看起來更像是數(shù)組。
打印結(jié)果
4. Notification通知
RAC通知使用
RAC會將通知名以及userInfo相關信息返回至block中
5. 定時器timer
6. 數(shù)組與字典
遍歷元素
RAC遍歷字典市袖、數(shù)組中的元素
RAC基本使用方法與流程
RAC基本使用方法與流程
????以上代碼中苍碟,subscribeNext作用為訂閱信號,可在該block中輸入邏輯相關代碼塊微峰。但當多個對象的邏輯存在于block中需要修改時,僅僅subscribeNext已不能滿足需求蜓肆。
RAC中信號的其它動作:
信號映射:map颜凯、flattenMap
信號過濾:filter症概、ignore、distinctUntilChanged
信號合并:combineLatest彼城、reduce、merge募壕、zipWith
信號連接:concat、then
信號操作時間:timeout语盈、interval、dely
信號跳過:skip
信號取值:take刀荒、takeLast、takeUntil
信號發(fā)送順序:donext照棋、cocompleted
獲取信號中的信號:switchToLatest
信號錯誤重試:retry
? ? 在實際開發(fā)過程中,需要在RAC代碼塊中添加邏輯代碼烈炭,避免不了引用當前類中的成員變量,那么需要在RAC方法外部寫入以下代碼:
@weakify(self)
? ? 在RAC的block代碼塊內(nèi)部寫入:
@strongify(self)
以此來避免出現(xiàn)block的循環(huán)引用符隙,至于為何要如此聲明,稍后會在后續(xù)文章中一一說明霹疫。
稍后會在后續(xù)的文章里繼續(xù)介紹如何使用,以及RAC信號流程原理丽蝎。demo代碼放到GitHub上demo鏈接
作者:我只不過是出來寫寫代碼
鏈接:http://www.reibang.com/p/74f1ea777017
來源:簡書
簡書著作權(quán)歸作者所有膀藐,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。