RAC(ReactiveCocoa)——基本使用(附簡單Demo)

?最近接觸學習到了RAC(ReactiveCocoa),RAC是函數(shù)式+響應式編程結合,首先得去理解何為響應式函數(shù)編程(FRP)。

? ? 看了許多介紹,舉一個最通俗易懂的例子——在命令式編程環(huán)境中, a = b+c表示將表達式的結果賦給 a,而之后改變 b 或 c的值不會影響 a。但在響應式編程中,a的值會隨著 b或 c的更新而更新,意味著聲明了一種綁定關系,b、c的變化會直接影響到a。

? ? 之前在iOS工作中,類之間的傳值,無非就是block、delegate代理、KVO、notification這幾種方法。在RAC中,同樣具備替代KVO、delegate代理、通知、UI target、計時器timer、數(shù)據(jù)結構等各種方法。依據(jù)響應式函數(shù)編程,RAC方法本身更加簡潔明了,通過提供信號的方式(RACSignal)可以捕捉當前以及未來的屬性值變化,而且無需持續(xù)觀察和更新代碼??芍苯釉赽lock中將邏輯代碼加入其中,使得代碼緊湊,更加直觀。

? ? 先來介紹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書寫容易產生手寫錯誤。在對應類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ù)組。

打印結果

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代碼塊內部寫入:

@strongify(self)

以此來避免出現(xiàn)block的循環(huán)引用,至于為何要如此聲明,稍后會在后續(xù)文章中一一說明。

稍后會在后續(xù)的文章里繼續(xù)介紹如何使用,以及RAC信號流程原理。demo代碼放到GitHub上demo鏈接

作者:我只不過是出來寫寫代碼

鏈接:http://m.itdecent.cn/p/74f1ea777017

來源:簡書

簡書著作權歸作者所有,任何形式的轉載都請聯(lián)系作者獲得授權并注明出處。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容