登錄狀態(tài)管理

我們重新走下流程 ??,用 純函數(shù) 做狀態(tài)管理:

typealias UserID = String

enum LoginError: Error, Equatable {
    case usernamePasswordMismatch
    case offline
}

//首先秉继,我們得有個(gè)狀態(tài)
struct State: Equatable {

    var username: String    // 輸入的用戶名
    var password: String    // 輸入的密碼

    var loading: Bool         // 登錄中
    var data: UserID?        // 登錄成功
    var error: LoginError?  // 登錄失敗

   //然后圈暗,我們要有各種事件
    enum Event {
        case onUpateUsername(String)
        case onUpatePassword(String)
        case onTriggerLogin
        case onLoginSuccess(UserID)
        case onLoginError(LoginError)
    }

    //最后,我們要有一個(gè) 純函數(shù) 來(lái)管理我們的狀態(tài)
    static func reduce(_ state: State, event: Event) -> State {
        var newState = state
        switch event {
        case .onUpateUsername(let username):
            newState.username = username
        case .onUpatePassword(let password):
            newState.password = password
        case .onTriggerLogin:
            newState.loading = true
            newState.data = nil
            newState.error = nil
        case .onLoginSuccess(let userId):
            newState.loading = false
            newState.data = userId
        case .onLoginError(let error):
            newState.loading = false
            newState.error = error
        }
        return newState
    }
}

現(xiàn)在我們可以在測(cè)試環(huán)境模擬各種事件缘挽,并且判斷結(jié)果是否符合預(yù)期:


//更新用戶名事件
func testOnUpateUsername() {
    
    let state = State(username: "",password: "",loading: false,data: nil,error: nil)
    
    let newState = State.reduce(state, event: .onUpateUsername("beeth0ven"))
    
    let expect = State(username: "beeth0ven",password: "",loading: false,data: nil,error: nil)
    
    newState == expect // 結(jié)果:true ??
}
//更新密碼事件
func testOnUpatePassword() {
    
    let state = State(username: "beeth0ven",password: "",loading: false,data: nil,error: nil)
    
    let newState = State.reduce(state, event: .onUpatePassword("123456"))
    
    let expect = State(username: "beeth0ven",password: "123456",loading: false,data: nil,error: nil)
    
    newState == expect // 結(jié)果:true ??
}
//觸發(fā)登錄事件
func testOnTriggerLogin() {
    
    let state = State(username: "beeth0ven",password: "123456",loading: false,data: nil,error: nil)
    
    let newState = State.reduce(state, event: .onTriggerLogin)
    
    let expect = State(username: "beeth0ven",password: "123456",loading: true,data: nil,error: nil)
    
    newState == expect // 結(jié)果:true ??
}
//登錄成功事件
func testOnLoginSuccess() {
    
    let state = State(username: "beeth0ven",password: "123456",loading: true,data: nil,error: nil)
    
    let newState = State.reduce(state, event: .onLoginSuccess("userID007"))
    
    let expect = State(username: "beeth0ven",password: "123456",loading: false,data: "userID007",error: nil)
    
    newState == expect // 結(jié)果:true ??
}
//登錄失敗事件
func testOnLoginError() {
    
    let state = State(username: "beeth0ven",password: "123456",loading: true,data: nil,error: nil)
    
    let newState = State.reduce(state, event: .onLoginError(.usernamePasswordMismatch))
    
    let expect = State(username: "beeth0ven",password: "123456",loading: false,data: nil,error: .usernamePasswordMismatch)
    
    newState == expect // 結(jié)果:true ??
}


這樣我們可以輕易掌控程序的運(yùn)行狀態(tài)瞄崇,以及各種狀態(tài)更新。

現(xiàn)在到踏,我們知道如何用 純函數(shù) 做狀態(tài)管理了杠袱。不過(guò)當(dāng)前的代碼形態(tài),離投入生產(chǎn)環(huán)境窝稿,還存在好幾個(gè)過(guò)度形態(tài)。這些過(guò)度形態(tài)有的是圍繞如何引入 附加作用凿掂,而做了一些應(yīng)用架構(gòu)伴榔。

在這個(gè)問(wèn)題上,不同地架構(gòu)也提出了不同的解決方案庄萎,如:RxFeedbackfeedbackLoop 引入 附加作用踪少,Reduxmiddleware 引入 附加作用 等等。這里就不一一介紹了糠涛,這些庫(kù)的官方網(wǎng)站都會(huì)有相關(guān)說(shuō)明援奢。

最后,我們還是將代碼演化到下一個(gè)形態(tài)忍捡,這里我選擇使用 Redux 流派集漾。因?yàn)閭€(gè)人的覺(jué)得他的知識(shí)依賴要少一些切黔,可以讓更多讀者從中獲益。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末具篇,一起剝皮案震驚了整個(gè)濱河市纬霞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驱显,老刑警劉巖诗芜,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異埃疫,居然都是意外死亡伏恐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門栓霜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)脐湾,“玉大人,你說(shuō)我怎么就攤上這事叙淌±瓴叮” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵奔穿,是天一觀的道長(zhǎng)磷瘤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)茂洒,這世上最難降的妖魔是什么孟岛? 我笑而不...
    開(kāi)封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮督勺,結(jié)果婚禮上渠羞,老公的妹妹穿的比我還像新娘。我一直安慰自己智哀,他們只是感情好次询,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瓷叫,像睡著了一般屯吊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摹菠,一...
    開(kāi)封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天盒卸,我揣著相機(jī)與錄音,去河邊找鬼次氨。 笑死蔽介,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虹蓄,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼犀呼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了武花?” 一聲冷哼從身側(cè)響起圆凰,我...
    開(kāi)封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎体箕,沒(méi)想到半個(gè)月后专钉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡累铅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年跃须,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娃兽。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡菇民,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出投储,到底是詐尸還是另有隱情第练,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布玛荞,位于F島的核電站娇掏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏勋眯。R本人自食惡果不足惜婴梧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望客蹋。 院中可真熱鬧塞蹭,春花似錦、人聲如沸讶坯。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)闽巩。三九已至钧舌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涎跨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工崭歧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隅很,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叔营,于是被迫代替她去往敵國(guó)和親屋彪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容