iOS RAC總結

Demogit

  1. ReactiveCocoa 簡介(做者、做用、爲何要用)
  2. ReactiveCocoa 做用
  3. ReactiveCocoa 工做原理和編程思想
  4. ReactiveCocoa 框架思惟導圖
  5. ReactiveCocoa 常見類
  6. ReactiveCocoa 常見宏
  7. ReactiveCocoa 常見用法
  8. ReactiveCocoa 常見方法
  9. UI - Category(經常使用匯總)
  10. Foundation - Category (經常使用匯總)

1. ReactiveCocoa簡介

ReactiveCocoa(簡稱爲RAC),是由Github開源的一個應用於iOS和OS開發的新框架,Cocoa是蘋果整套框架的簡稱,所以不少蘋果框架喜歡以Cocoa結尾。github

2. ReactiveCocoa做用

談到RAC的做用,首先來看一下通常 iOS 工程的構建方法。 MVC,一個典型的 iOS 工程的構建形式,Model 呈現數據,View 呈現用戶界面,而 View Controller 調節它二者之間的交互。 編程

MVC.png

然而,雖然 View 和 View Controller 是技術上不一樣的組件,但它們幾乎老是成對的。 下面這張圖準確地描述了咱們可能已經編寫的 MVC 代碼。但它並無作太多事情來解決 iOS 應用中C層臃腫的的問題。在典型的 MVC 應用裏,許多邏輯被放在 View Controller 裏。它們中的一些確實屬於 View Controller,但更多的是所謂的「表示邏輯(presentation logic)」,以 MVVM 的術語來講,就是那些將 Model 數據轉換爲 View 能夠呈現的東西的事情,例如將一個 NSDate 轉換爲一個格式化過的 NSString。 [圖片上傳失敗...(image-ae0a0-1547395819243)] 咱們圖解裏缺乏某些東西,那些使咱們能夠把全部表示邏輯放進去的東西。咱們打算將其稱爲 「View Model」 —— 它位於 View/Controller 與 Model 之間: 數組

MVVM.png
MVVM.png

這個圖解準確地描述了什麼是 MVVM:一個 MVC 的加強版,咱們正式鏈接了視圖和控制器,並將表示邏輯從 Controller 移出放到一個新的對象裏,即 View Model。MVVM 本質上就是一個精心優化的 MVC 架構。對咱們來講,就是它能減小 ViewController 的複雜性並使得表示邏輯更易於測試緩存

RAC的做用就在於它提供了很好的API能夠很好的配合了MVVM的使用。 在咱們iOS開發過程當中,當某些事件響應的時候,須要處理某些業務邏輯,這些事件都用不一樣的方式來處理。好比按鈕的點擊使用action,ScrollView滾動使用delegate,屬性值改變使用KVO等系統提供的方式。其實這些事件,均可以經過RAC處理。 ReactiveCocoa爲事件提供了不少處理方法,並且利用RAC處理事件很方便,能夠把要處理的事情,和監聽的事情的代碼放在一塊兒,這樣很是方便咱們管理,就不須要跳到對應的方法裏。很是符合咱們開發中高聚合,低耦合的思想。網絡

3. ReactiveCocoa工做原理和編程思想

RAC工做原理.png

  • ReactiveCocoa編程思想:多線程

    • 函數式編程: 百度百科: 簡單說,"函數式編程"是一種"編程範式"(programming paradigm),也就是如何編寫程序的方法論。它屬於"結構化編程"的一種,主要思想是把運算過程儘可能寫成一系列嵌套的函數調用。 函數式編程思想:是把操做盡可能寫成一系列嵌套的函數或者方法調用。 函數式編程特色:每一個方法必須有返回值(自己對象),把函數或者Block當作參數,block參數(須要操做的值)block返回值(操做結果)。 在RAC代碼塊的複用。也就是信號量的複用。架構

    • 響應式編程: 百度百科:響應式編程是一種面向數據流和變化傳播的編程範式。這意味着能夠在編程語言中很方便地表達靜態或動態的數據流,而相關的計算模型會自動將變化的值經過數據流進行傳播。 響應式編程思想:不須要考慮調用順序,只須要知道考慮結果,相似於蝴蝶效應,產生一個事件,會影響不少東西,這些事件像流同樣的傳播出去,而後影響結果,借用面向對象的一句話,萬物皆是流。 關於響應式編程,RAC將咱們關注的點放到綁定。每一步都在操做和處理數據,但卻把操做點從之前的數據自己轉移到函數方法上邊去。將變量之間創建綁定,這就是響應式編程的內容。app

    ReactiveCocoa被描述爲函數響應式編程(FRP)框架。 之後使用RAC解決問題,就不須要考慮調用順序,直接考慮結果,把每一次操做都寫成一系列嵌套的方法中,使代碼高聚合,方便管理。框架

  • 操做思想

    • 運用的是Hook(鉤子)思想,Hook是一種用於改變API(應用程序編程接口:方法)執行結果的技術.
    • Hook用處:截獲API調用的技術。
    • Hook原理:在每次調用一個API返回結果以前,先執行你本身的方法,改變結果的輸出。

4. ReactiveCocoa思惟導圖

ReactiveCocoa.png

5. ReactiveCocoa常見類

學習框架首先搞清楚框架中經常使用的類,在RAC中最核心的類RACSiganl。

  • RACSiganl:信號類,通常表示未來有數據傳遞,只要有數據改變,信號內部接收到數據,就會立刻發出數據。
    RACEmptySignal :空信號,用來實現 RACSignal 的 +empty 方法;
    RACReturnSignal :一元信號,用來實現 RACSignal 的 +return: 方法;
    RACDynamicSignal :動態信號,使用一個 block - 來實現訂閱行爲,咱們在使用 RACSignal 的 +createSignal: 方法時建立的就是該類的實例;
    RACErrorSignal :錯誤信號,用來實現 RACSignal 的 +error: 方法;
    RACChannelTerminal :通道終端,表明 RACChannel 的一個終端,用來實現雙向綁定。

    注意:信號類(RACSiganl),只是表示當數據改變時,信號內部會發出數據,它自己不具有發送信號的能力,而是交給內部一個訂閱者去發出。 默認一個信號都是冷信號,也就是值改變了,也不會觸發,只有訂閱了這個信號,這個信號纔會變爲熱信號,值改變了纔會觸發。 如何訂閱信號:調用信號RACSignal的subscribeNext就能訂閱

  • RACSubscriber:表示訂閱者的意思,用於發送信號,這是一個協議

  • RACDisposable:用於取消訂閱或者清理資源,當信號發送完成或者發送錯誤的時候,就會自動觸發它。
    RACSerialDisposable :做爲 disposable 的容器使用,能夠包含一個 disposable 對象,而且容許將這個 disposable 對象經過原子操做交換出來
    RACKVOTrampoline :表明一次 KVO 觀察,而且能夠用來中止觀察
    RACCompoundDisposable :它能夠包含多個 disposable 對象,而且支持手動添加和移除 disposable 對象
    RACScopedDisposable :當它被 dealloc 的時候調用自己的 -dispose 方法。

  • RACSubject
    RACSubject:信號提供者,本身能夠充當信號,又能發送信號 使用場景:一般用來代替代理,有了它,就沒必要要定義代理了
    RACReplaySubject:重複提供信號類,RACSubject的子類
    RACGroupedSignal :分組信號,用來實現 RACSignal 的分組功能
    RACBehaviorSubject:重演最後值的信號,當被訂閱時,會向訂閱者發送它最後接收到的值
    RACReplaySubject:重演信號,保存發送過的值,當被訂閱時,會向訂閱者從新發送這些值

    RACReplaySubject與RACSubject區別: RACReplaySubject能夠先發送信號,在訂閱信號,RACSubject就不能夠。

    使用場景
    使用場景一:若是一個信號每被訂閱一次,就須要把以前的值重複發送一遍,使用重複提供信號類。
    使用場景二:能夠設置capacity數量來限制緩存的value的數量,即只緩充最新的幾個值

  • RACSequence:RAC中的集合類,用於代替NSArray,NSDictionary,可使用它來快速遍歷數組和字典

  • RACCommand:RAC中用於處理事件的類,能夠把事件如何處理,事件中的數據如何傳遞,包裝到這個類中,他能夠很方便的監控事件的執行過程。
    使用場景:監聽按鈕點擊,網絡請求

  • RACMulticastConnection:用於當一個信號,被屢次訂閱時,爲了保證建立信號時,避免屢次調用建立信號中的block,形成反作用,可使用這個類處理。
    使用注意:RACMulticastConnection經過RACSignal的-publish或者-muticast:方法建立

  • RACTuple:元組類,相似NSArray,用來包裝值

  • RACScheduler:RAC中的隊列,用GCD封裝的
    RACImmediateScheduler:當即執行調度的任務,這是惟一一個支持同步執行的調度器
    RACQueueScheduler :一個抽象的隊列調度器,在一個 GCD 串行列隊中異步調度全部任務
    RACTargetQueueScheduler :繼承自 RACQueueScheduler ,在一個以一個任意的 GCD 隊列爲 target 的串行隊列中異步調度全部任務
    RACSubscriptionScheduler :一個只用來調度訂閱的調度器

  • RACUnit :表⽰stream不包含有意義的值,也就是看到這個,能夠直接理解爲nil

  • RACEvent: 把數據包裝成信號事件(signal event)。它主要經過RACSignal的-materialize來使用

6. ReactiveCocoa常見宏

RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用於給某個對象的某個屬性綁定
RACObserve(self, name):監聽某個對象的某個屬性,返回的是信號
RACTuplePack:把數據包裝成RACTuple(元組類)
RACTupleUnpack:把RACTuple(元組類)解包成對應的數據

7. ReactiveCocoa常見用法

rac_signalForSelector:用於替代代理。
rac_valuesAndChangesForKeyPath:代替KVO,用於監聽某個對象的屬性改變
rac_signalForControlEvents:用於監聽某個事件
rac_addObserverForName:用於監聽某個通知
rac_textSignal:監聽文本框文字改變
rac_liftSelector:withSignalsFromArray:Signals:當傳入的Signals(信號數組),每個signal都至少sendNext過一次,就會去觸發第一個selector參數的方法。 (使用注意:幾個信號,參數一的方法就幾個參數,每一個參數對應信號發出的數據。處理當界面有屢次請求時,須要都獲取到數據時,才能展現界面:)

8. ReactiveCocoa常見方法

  • ReactiveCocoa操做方法之綁定

    • ReactiveCocoa操做的核心方法是bind(綁定),並且RAC中核心開發方式,也是綁定,以前的開發方式是賦值,而用RAC開發,應該把重心放在綁定,也就是能夠在建立一個對象的時候,就綁定好之後想要作的事情,而不是等賦值以後在去作事情。
    • 例如:把數據展現到控件上,以前都是重寫控件的setModel方法,用RAC就能夠在一開始建立控件的時候,就綁定好數據。
    • 在開發中不多使用bind方法,bind屬於RAC中的底層方法,RAC已經封裝了不少好用的其餘方法,底層都是調用bind,用法比bind簡單(flattenMap、skip、take、takeUntilBlock、skipUntilBlock、distinctUntilChanged等function都用到了bind方法。咱們能夠發現不少地方都繼承和重寫bind方法).
    • 修改bindBlock 從而作到修改返回
  • ReactiveCocoa操做方法之映射
    Map:把源信號的值映射成一個新的值
    flattenMap:把源信號的內容映射成一個新的信號,信號能夠是任意類型。
    FlatternMap和Map的區別
    1.FlatternMap中的Block返回信號。
    2.Map中的Block返回對象。
    3.開發中,若是信號發出的值不是信號,映射通常使用Map
    4.開發中,若是信號發出的值是信號,映射通常使用FlatternMap。

  • ReactiveCocoa操做方法之組合
    concat:按必定順序拼接信號,當多個信號發出的時候,有順序的接收信號
    then:用於鏈接兩個信號,當第一個信號完成,纔會鏈接then返回的信號 merge:把多個信號合併爲一個信號,任何一個信號有新值的時候就會調用
    zipWith:把兩個信號壓縮成一個信號,只有當兩個信號同時發出信號內容時,而且把兩個信號的內容合併成一個元組,纔會觸發壓縮流的next事件
    combineLatest:將多個信號合併起來,而且拿到各個信號的最新的值,必須每一個合併的signal至少都有過一次sendNext,纔會觸發合併的信號
    reduce(聚合):用於信號發出的內容是元組,把信號發出元組的值聚合成一個值

  • ReactiveCocoa操做方法之過濾
    filter:過濾,每次信號發出,會先執行過濾條件判斷
    ignore:內部調用filter過濾,忽略掉ignore的值
    distinctUntilChanged:當上一次的值和當前的值有明顯的變化就會發出信號,不然會被忽略掉
    take:從開始一共取N次的信號
    takeLast:取最後N次的信號,前提條件,訂閱者必須調用完成,由於只有完成,就知道總共有多少信號
    takeUntil:(RACSignal *):獲取信號直到某個信號執行完成
    skip:(NSUInteger):跳過幾個信號,不接受
    switchToLatest:用於signalOfSignals(信號的信號),有時候信號也會發出信號,會在signalOfSignals中,獲取signalOfSignals發送的最新信號

  • 執行順序
    doNext: 執行Next以前,會先執行這個Block
    doCompleted: 執行sendCompleted以前,會先執行這個Block

  • ReactiveCocoa操做方法之時間
    timeout:超時,可讓一個信號在必定的時間後,自動報錯
    interval(定時):每隔一段時間發出信號
    delay: 延遲發送next

  • ReactiveCocoa操做方法之重複
    retry(重試) :只要失敗,就會從新執行建立信號中的block,直到成功
    replay(重放):當一個信號被屢次訂閱,反覆播放內容
    throttle(節流):當某個信號發送比較頻繁時,可使用節流,在某一段時間不發送信號內容,過了一段時間獲取信號的最新內容發出

  • ReactiveCocoa操做方法之線程
    deliverOn: 內容傳遞切換到制定線程中,反作用在原來線程中,把在建立信號時block中的代碼稱之爲反作用
    subscribeOn: 內容傳遞和反作用都會切換到制定線程中

9. UI - Category(經常使用匯總)

  • rac_prepareForReuseSignal: 須要複用時用
    相關UI: MKAnnotationView、UICollectionReusableView、UITableViewCell、UITableViewHeaderFooterView
  • rac_buttonClickedSignal:點擊事件觸發信號
    相關UI:UIActionSheet、UIAlertView
  • rac_command:button類、刷新類相關命令替換
    相關UI:UIBarButtonItem、UIButton、UIRefreshControl
  • rac_signalForControlEvents: control event 觸發
    相關UI:UIControl
  • rac_gestureSignal UIGestureRecognizer 事件處理信號
    相關UI:UIGestureRecognizer
  • rac_imageSelectedSignal 選擇圖片的信號
    相關UI:UIImagePickerController
  • rac_textSignal
    相關UI:UITextField、UITextView
  • 可實現雙向綁定的相關API
    • rac_channelForControlEvents: key: nilValue:
      相關UI:UIControl類
    • rac_newDateChannelWithNilValue:
      相關UI:UIDatePicker
    • rac_newSelectedSegmentIndexChannelWithNilValue:
      相關UI:UISegmentedControl
    • rac_newValueChannelWithNilValue:
      相關UI:UISlider、UIStepper
    • rac_newOnChannel
      相關UI:UISwitch
    • rac_newTextChannel
      相關UI:UITextField

10. Foundation - Category (經常使用匯總)

  1. NSArray
    rac_sequence 信號集合
  2. NSData
    rac_readContentsOfURL: options: scheduler: 比oc多出線程設置
  3. NSDictionary
    rac_sequence 不解釋
    rac_keySequence key 集合
    rac_valueSequence value 集合
  4. NSEnumerator
    rac_sequence 不解釋
  5. NSFileHandle
    rac_readInBackground 見名知意
  6. NSIndexSet
    rac_sequence 不解釋
  7. NSInvocation
    rac_setArgument: atIndex: 設置參數
    rac_argumentAtIndex 取某個參數
    rac_returnValue 所關聯方法的返回值
  8. NSNotificationCenter
    rac_addObserverForName: object:註冊通知
  9. NSObject
    rac_willDeallocSignal 對象銷燬時發動的信號
    rac_description debug用
    rac_observeKeyPath: options: observer: block:監聽某個事件
    rac_liftSelector: withSignals: 所有信號都next在執行
    rac_signalForSelector: 代替某個方法
    rac_signalForSelector:(SEL)selector fromProtocol:代替代理
  10. NSOrderedSet
    rac_sequence 不解釋
  11. NSSet
    rac_sequence 不解釋
  12. NSString
    rac_keyPathComponents 獲取一個路徑全部的部分
    rac_keyPathByDeletingLastKeyPathComponent 刪除路徑最後一部分
    rac_keyPathByDeletingFirstKeyPathComponent 刪除路徑第一部分
    rac_sequence 不解釋 (character)
    rac_readContentsOfURL: usedEncoding: scheduler: 比之OC多線程調用
  13. NSURLConnection
    rac_sendAsynchronousRequest 發起異步請求
  14. NSUserDefaults
    rac_channelTerminalForKey 用於雙向綁定,此乃一端

參考文章:
最快讓你上手ReactiveCocoa之進階篇
iOS ReactiveCocoa 最全經常使用API整理
Introduction to MVVM

文章推薦:
ReactiveCocoa & MVVM 學習總結一
學習ReactiveCocoa教程

相關文章
相關標籤/搜索