最快讓你上手ReactiveCocoa之基礎篇

發表於2016-06-20

前言

很多blog都說ReactiveCocoa好用,然後各種秀自己如何靈活運用ReactiveCocoa,但是感覺真正缺少的是一篇如何學習ReactiveCocoa的文章,小編看了很多篇都沒看出怎麼使用ReactiveCocoa,於是決定自己寫一遍關於學習ReactiveCocoa的文章,本文主要針對如何從零開始學習ReactiveCocoa,這裡非常感謝3個人(支點的雷純鋒,camera360的宋潘,以及我的小學弟何宗柱(我愛科技)),在我研究ReactiveCocoa對我的幫助。
如果喜歡我的文章,可以關注我,也可以來小碼哥,瞭解下我們的iOS培訓課程。之後還會更新《最快讓你上手ReactiveCocoa之進階篇》

1.ReactiveCocoa簡介

ReactiveCocoa(簡稱為RAC),是由Github開源的一個應用於iOS和OS開發的新框架,Cocoa是蘋果整套框架的簡稱,因此很多蘋果框架喜歡以Cocoa結尾。

2.ReactiveCocoa作用

  • 在我們iOS開發過程中,當某些事件響應的時候,需要處理某些業務邏輯,這些事件都用不同的方式來處理。
  • 比如按鈕的點選使用action,ScrollView滾動使用delegate,屬性值改變使用KVO等系統提供的方式。
  • 其實這些事件,都可以通過RAC處理
  • ReactiveCocoa為事件提供了很多處理方法,而且利用RAC處理事件很方便,可以把要處理的事情,和監聽的事情的程式碼放在一起,這樣非常方便我們管理,就不需要跳到對應的方法裡。非常符合我們開發中高聚合,低耦合的思想。

3.程式設計思想

在開發中我們也不能太依賴於某個框架,否則這個框架不更新了,導致專案後期沒辦法維護,比如之前Facebook提供的Three20框架,在當時也是神器,但是後來不更新了,也就沒什麼人用了。因此我感覺學習一個框架,還是有必要了解它的程式設計思想

先簡單介紹下目前我們們已知的程式設計思想

3.1 程式導向:處理事情以過程為核心,一步一步的實現。

3.2 物件導向:萬物皆物件

3.3 鏈式程式設計思想:是將多個操作(多行程式碼)通過點號(.)連結在一起成為一句程式碼,使程式碼可讀性好。a(1).b(2).c(3)

  • 鏈式程式設計特點:方法的返回值是block,block必須有返回值(本身物件),block引數(需要操作的值)
  • 代表:masonry框架。
  • 模仿masonry,寫一個加法計算器,練習鏈式程式設計思想。

41

Snip20150925_2.png

42

Snip20151225_4.png

43

Snip20150925_1.png

44

Snip20151225_5.png

45

Paste_Image.png

3.4 響應式程式設計思想:不需要考慮呼叫順序,只需要知道考慮結果,類似於蝴蝶效應,產生一個事件,會影響很多東西,這些事件像流一樣的傳播出去,然後影響結果,借用物件導向的一句話,萬物皆是流。

  • 代表:KVO運用。

3.5 函數語言程式設計思想:是把操作儘量寫成一系列巢狀的函式或者方法呼叫。

  • 函數語言程式設計特點:每個方法必須有返回值(本身物件),把函式或者Block當做引數,block引數(需要操作的值)block返回值(操作結果)
  • 代表:ReactiveCocoa。
  • 用函數語言程式設計實現,寫一個加法計算器,並且加法計算器自帶判斷是否等於某個值.

45

Paste_Image.png

46

Paste_Image.png

4.ReactiveCocoa程式設計思想

ReactiveCocoa結合了幾種程式設計風格:

函數語言程式設計(Functional Programming)

響應式程式設計(Reactive Programming)

所以,你可能聽說過ReactiveCocoa被描述為函式響應式程式設計(FRP)框架。

以後使用RAC解決問題,就不需要考慮呼叫順序,直接考慮結果,把每一次操作都寫成一系列巢狀的方法中,使程式碼高聚合,方便管理。

5.如何匯入ReactiveCocoa框架

通常都會使用CocoaPods(用於管理第三方框架的外掛)幫助我們匯入。

PS:CocoaPods教程

注意

  • podfile如果只描述pod ‘ReactiveCocoa’, ‘~> 4.0.2-alpha-1’,會匯入不成功。

    51

    Snip20150926_1.png
  • 報錯提示資訊

52

Snip20150926_2.png
  • 需要在podfile加上use_frameworks,重新pod install 才能匯入成功。

53

Snip20150926_3.png

6.ReactiveCocoa常見類。

學習框架首要之處:個人認為先要搞清楚框架中常用的類,在RAC中最核心的類RACSiganl,搞定這個類就能用ReactiveCocoa開發了。

6.1RACSiganl:訊號類,一般表示將來有資料傳遞,只要有資料改變,訊號內部接收到資料,就會馬上發出資料。

注意

  • 訊號類(RACSiganl),只是表示當資料改變時,訊號內部會發出資料,它本身不具備傳送訊號的能力,而是交給內部一個訂閱者去發出。
  • 預設一個訊號都是冷訊號,也就是值改變了,也不會觸發,只有訂閱了這個訊號,這個訊號才會變為熱訊號,值改變了才會觸發。
  • 如何訂閱訊號:呼叫訊號RACSignal的subscribeNext就能訂閱。
  • RACSiganl簡單使用:

6.2 RACSubscriber:表示訂閱者的意思,用於傳送訊號,這是一個協議,不是一個類,只要遵守這個協議,並且實現方法才能成為訂閱者。通過create建立的訊號,都有一個訂閱者,幫助他傳送資料。

6.3 RACDisposable:用於取消訂閱或者清理資源,當訊號傳送完成或者傳送錯誤的時候,就會自動觸發它。

  • 使用場景:不想監聽某個訊號時,可以通過它主動取消訂閱訊號。

6.4 RACSubject:RACSubject:訊號提供者,自己可以充當訊號,又能傳送訊號。

  • 使用場景:通常用來代替代理,有了它,就不必要定義代理了。

RACReplaySubject:重複提供訊號類,RACSubject的子類。

  • RACReplaySubjectRACSubject區別:
    • RACReplaySubject可以先傳送訊號,在訂閱訊號,RACSubject就不可以。
  • 使用場景一:如果一個訊號每被訂閱一次,就需要把之前的值重複傳送一遍,使用重複提供訊號類。
  • 使用場景二:可以設定capacity數量來限制快取的value的數量,即只緩充最新的幾個值。
  • RACSubject和RACReplaySubject簡單使用:

  • RACSubject替換代理

6.6RACTuple:元組類,類似NSArray,用來包裝值.

6.7RACSequence:RAC中的集合類,用於代替NSArray,NSDictionary,可以使用它來快速遍歷陣列和字典。

使用場景:1.字典轉模型

RACSequence和RACTuple簡單使用

6.8RACCommand:RAC中用於處理事件的類,可以把事件如何處理,事件中的資料如何傳遞,包裝到這個類中,他可以很方便的監控事件的執行過程。

使用場景:監聽按鈕點選,網路請求

RACCommand簡單使用

6.9RACMulticastConnection:用於當一個訊號,被多次訂閱時,為了保證建立訊號時,避免多次呼叫建立訊號中的block,造成副作用,可以使用這個類處理。

使用注意:RACMulticastConnection通過RACSignal的-publish或者-muticast:方法建立.

RACMulticastConnection簡單使用:

6.10 RACScheduler:RAC中的佇列,用GCD封裝的。

6.11 RACUnit :表⽰stream不包含有意義的值,也就是看到這個,可以直接理解為nil.

6.12 RACEvent: 把資料包裝成訊號事件(signal event)。它主要通過RACSignal的-materialize來使用,然並卵。

7.ReactiveCocoa開發中常見用法。

7.1 代替代理:

  • rac_signalForSelector:用於替代代理。

7.2 代替KVO :

  • rac_valuesAndChangesForKeyPath:用於監聽某個物件的屬性改變。

7.3 監聽事件:

  • rac_signalForControlEvents:用於監聽某個事件。

7.4 代替通知:

  • rac_addObserverForName:用於監聽某個通知。

7.5 監聽文字框文字改變:

  • rac_textSignal:只要文字框發出改變就會發出這個訊號。

7.6 處理當介面有多次請求時,需要都獲取到資料時,才能展示介面

  • rac_liftSelector:withSignalsFromArray:Signals:當傳入的Signals(訊號陣列),每一個signal都至少sendNext過一次,就會去觸發第一個selector引數的方法。
  • 使用注意:幾個訊號,引數一的方法就幾個引數,每個引數對應訊號發出的資料。

7.7 程式碼演示

8.ReactiveCocoa常見巨集。

8.1 RAC(TARGET, [KEYPATH, [NIL_VALUE]]):用於給某個物件的某個屬性繫結。

8.2 RACObserve(self, name):監聽某個物件的某個屬性,返回的是訊號。

8.3 @weakify(Obj)和@strongify(Obj),一般兩個都是配套使用,在主標頭檔案(ReactiveCocoa.h)中並沒有匯入,需要自己手動匯入,RACEXTScope.h才可以使用。但是每次匯入都非常麻煩,只需要在主標頭檔案自己匯入就好了。

8.4 RACTuplePack:把資料包裝成RACTuple(元組類)

8.5 RACTupleUnpack:把RACTuple(元組類)解包成對應的資料。

聯絡方式

如果你喜歡這篇文章,可以繼續關注我,微博:吖了個崢,歡迎交流。

(PS:另外我們們公司小碼哥,誠邀IT屆有事業心,有能力,有拼勁,有幹勁各路英豪加盟一起創業,詳情可以點選小碼哥,小碼哥官方微博,或者微博私聊我)

相關文章