BKRedux 1.3.7

BKRedux 1.3.7

Burt.K 维护。



 
依赖于
RxSwift>= 4.2.0
RxCocoa>= 4.2.0
 

BKRedux 1.3.7

BKRedux

BKRedux 是 Redux store 在 Swift 中的实现。

如何安装

pod 'BKRedux'

计数器示例

定义状态

您应该确认 State 协议来定义您的状态。

struct MyState: State {
    var count: Int = 0
    var color: UIColor = UIColor.white
    var error: (Error, Action)? = nil
}

定义动作

struct IncreaseAction: Action {
    let payload = 1
}

struct DecreaseAction: Action {
    let payload = -1
}

struct RandomColorAction: Action {
    private static let colors = [
        UIColor.blue,
        UIColor.yellow,
        UIColor.red,
        UIColor.magenta,
        UIColor.purple,
        UIColor.brown,
        UIColor.lightGray,
        UIColor.white
    ]
    
    let payload: UIColor = RandomColorAction.colors[Int(arc4random()) % RandomColorAction.colors.count]
}

定义还原器

计数状态还原器

import Foundation
import RxSwift

func countReducer(state: State, action: Action) -> Observable<State> {
    guard var mutableState = state as? MyState else { return .just(state) }
        
    switch action {
    case let act as IncreaseAction:
        mutableState.count += act.payload
    case let act as DecreaseAction:
        mutableState.count += act.payload
    default:
        break
    }
    
    return .just(mutableState)
}

颜色状态还原器

import RxSwift
import UIKit

func colorReducer(state: State, action: Action) -> Observable<State> {
    guard var mutableState = state as? MyState else { return .just(state) }
    
    if let act = action as? RandomColorAction {
        mutableState.color = act.payload
    }
    return .just(mutableState)
}

根据需要定义中间件。

控制台日志中间件

import Foundation
import RxSwift

func consoleLogMiddleware(state: State, action: Action) -> Observable<State> {
    print("[## LOGGING ##] action: \(String(describing: action)) :: state: \(state)")
    return Observable.just(state)
}

打印缓存值中间件

import Foundation
import RxSwift

func printCacheValue(state: State, action: Action) -> Observable<State> {
    print("[## CACHED ##] value: \(UserDefaults.standard.integer(forKey: "count"))")
    return  Observable.just(state)
}

根据需要定义前置处理函数。

缓存计数值前置处理函数

import Foundation
import RxSwift

func cachePostware(state: State, action: Action) -> Observable<State> {
    return Single.create(subscribe: { (single) -> Disposable in
        guard let mystate = state as? MyState else {
            single(.success(state))
            return Disposables.create()
        }
        
        UserDefaults.standard.set(mystate.count, forKey: "count")
        UserDefaults.standard.synchronize()
        single(.success(mystate))
        
        return Disposables.create()
    }).asObservable()
}

如需,请创建 ViewModel。

BKRedux 提供了 ViewModelType 用于 MVVM。ViewModelType 确保 rx_action 和 rx_state 更容易绑定。

import Foundation
import RxSwift
import RxCocoa

struct MyState: State {
    var count: Int = 0
    var color: UIColor = UIColor.white
    var error: (Error, Action)? = nil
}

class ViewModel: ViewModelType<MyState> {
    
    let rx_count =  BehaviorRelay<String>(value: "0")
    let rx_color = BehaviorRelay<UIColor>(value: UIColor.white)
    
    override init() {
        super.init()

        // STORE
        store.set(
            initialState: MyState(),
            middlewares: [
                printCacheValue,
                consoleLogMiddleware
            ],
            reducers: [
                countReducer,
                colorReducer
            ],
            postwares: [
                cachePostware
            ]
        )
    }
    
    override func on(newState: MyState) {
        rx_count.accept(String(newState.count))
        rx_color.accept(newState.color)
    }
    
    override func on(error: Error, action: Action) {
        
    }
    
    deinit {
        print("[## deinit ##]")
    }
}

创建 ViewController

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {
    
    @IBOutlet weak var countLabel: UILabel!
    @IBOutlet weak var minusButton: UIButton!
    @IBOutlet weak var colorButton: UIButton!
    @IBOutlet weak var plusButton: UIButton!
    
    
    private let viewModel = ViewModel()
    private let disposeBag = DisposeBag()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        plusButton.rx.tap.map { IncreaseAction() }.bind(to: viewModel.rx_action).disposed(by: disposeBag)
        minusButton.rx.tap.map { DecreaseAction() }.bind(to: viewModel.rx_action).disposed(by: disposeBag)
        colorButton.rx.tap.map { RandomColorAction() }.bind(to: viewModel.rx_action).disposed(by: disposeBag)

        viewModel.rx_color
            .asDriver()
            .drive(onNext: { [weak self] (color) in
                if self?.view.backgroundColor != color {
                    self?.view.backgroundColor = color
                }
            })
            .disposed(by: disposeBag)
        
        viewModel.rx_count
            .asDriver()
            .drive(onNext: { [weak self] (countString) in
                self?.countLabel.text = countString
            })
            .disposed(by: disposeBag)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
        
}

MIT 许可协议

MIT 许可协议

版权所有 © 2018 Sungcheol Kim, http://github.com/ReactComponentKit/BKRedux

以下情况下,对本软件以及相关的文档文件(以下称为“软件”)的副本获取者授予免费、非排他性、可转授的许可权,使其能够无限制地处理软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可以及/或销售软件副本,以及允许向软件提供副本的个人这样做,前提如下

上述版权声明和本许可声明应包含在软件的所有副本中或实质部分的副本中。

软件按“现状”提供,不提供任何形式的保证,不论是否明确或隐含,包括但不限于适销性、特定目的的适用性和非侵权性。在任何情况下,作者或版权所有者不对因软件或软件的使用或其他活动产生的任何索赔、损害或其他责任负责,无论源于合同、侵权或其他形式的行为,无论是由于、出自或与软件或其使用或其他活动相关。