-
ReactorKit 是一個輕量的響應(yīng)式編程框架。它結(jié)合了 Flux 和響應(yīng)式編程。用戶行為和頁面狀態(tài)都是通過序列相互傳遞。同時這些序列都是單向的:
- 頁面(View)只能發(fā)出用戶行為。
- 而反應(yīng)器(Reactor)只能發(fā)出狀態(tài)
-
整體架構(gòu)
使用 ReactorKit 架構(gòu)后代碼根據(jù)職能分為 View(視圖)和 Reactor(響應(yīng)器)兩部分:
- View 是用戶直接操作的層級,我們通過監(jiān)測用戶在 View 上的行為,轉(zhuǎn)化成 Action 反饋給 Reactor。
- Reactor 處理之后又把響應(yīng)狀態(tài) State 傳遞給 View 層,View 這邊顯示最終的傳遞的狀態(tài)。
簡單來說就是 View 層只發(fā)出行為,而 Reactor 只發(fā)出狀態(tài),相互把對方所需要的東西傳遞給對方,構(gòu)成一條響應(yīng)式的序列。
-
Reactor 代碼結(jié)構(gòu)
Reactor 是與 UI 相互獨立的一層,它的作用就是將業(yè)務(wù)邏輯從 View 中抽離。也就是說每一個 View 都有對應(yīng)的 Reactor ,并且將所有的邏輯代理都較給 Reactor(Reactor 接收到 View 層發(fā)出的 Action,然后通過內(nèi)部操作,將 Action 轉(zhuǎn)換為 State。)
定義一個 Reactor 需要遵守 Reactor 協(xié)議,該協(xié)議定義了如下內(nèi)容:
四個響應(yīng)屬性:Action、Mutation、State、initialState。
兩個響應(yīng)方法:mutate()、reduce()-
這些響應(yīng)屬性和響應(yīng)方法的作用,以及相互關(guān)系如下:
- Action:描述用戶行為
- Mutation:描述狀態(tài)變更( 它可以看作是 Action 到 State 的橋梁)
- State:描述當(dāng)前狀態(tài)
- initialState:描述初始化狀態(tài)
- mutate():處理 Action 執(zhí)行一些業(yè)務(wù)邏輯,并轉(zhuǎn)換為 Mutation。
- reduce(): 通過舊的 State 以及 Mutation 創(chuàng)建一個新的 State。
-
View 代碼結(jié)構(gòu)
View 為數(shù)據(jù)展示層,不管是 UIViewController 還是 UIView 都可以看作是 View。View 主要負(fù)責(zé)發(fā)出 Action,同時將 State 綁定到 UI 組件上。
-
定義一個 View 只需要讓它遵循 ReactorKit 的 View 或 StoryboardView 協(xié)議即可:
- 如果 ViewController 是純代碼開發(fā)的:則其遵守 View 協(xié)議。
- 如果 ViewController 是 Storyboard 開發(fā)的:則其遵守 StoryboardView 協(xié)議。
-
View 中需要定義如下內(nèi)容:
- disposeBag 屬性:協(xié)議屬性。當(dāng) View 的 reactor 變化時,之前的 disposeBag 會自動 disposed。
- bind(reactor:) 方法:實現(xiàn)用戶輸入綁定和狀態(tài)輸出綁定。
-
協(xié)議中的 bind() 方法不需要我們手動去調(diào)用。遵循 View 協(xié)的類將自動獲得一個 reactor 屬性。當(dāng) View 的 reactor 屬性被設(shè)置時,bind() 方法就會被自動調(diào)用。而 reactor 屬性的設(shè)置又分兩種情況:
- 純代碼開發(fā)的 ViewController 則在其創(chuàng)建實例對象后,直接注入 reactor:
- 使用 Storyboard 的 ViewController 則需要在其內(nèi)部的 viewDidLoad() 方法中設(shè)置 reactor
參考文章:Swift - RxSwift的使用詳解72(ReactorKit架構(gòu)1:安裝配置、基本用法)
Swift - RxSwift的使用詳解73(ReactorKit架構(gòu)2:一個用戶注冊樣例)
Swift - RxSwift的使用詳解74(ReactorKit架構(gòu)3:GitHub資源搜索樣例)