FluxxKit
Overview
Unidirectional data flow for reactive programming in iOS.
Porting facebook's flux implementation in Swift, except callback called when store changes.
Why no callback?
We have RxSwift, ReactiveSwift, ReactiveKit or something else. All the stateful things could be implemented as Observable or Stream, and ViewController could bind and react to them.
Getting Started
- State
import FluxxKit
import RxSwift
final class ViewModel: StateType {
var count = Observable<Int>(0)
}
- Action
extension ViewModel {
enum Action: ActionType {
case plus
case minus
}
}
- Reducer
extension ViewModel {
final class Reducer: FluxxKit.Reducer<ViewModel, Action> {
override func reduce(action: Action, to state: ViewModel) {
switch action {
case .plus:
state.count.value = state.count + 1
case .minus:
state.count.value = state.count - 1
}
}
}
}
- View
Create store and register it to dispatcher, and bind store's state:
import FluxxKit
import RxSWift
final class ViewController: UIViewController {
@IBOutlet var counterLabel: UILabel!
@IBOutlet var plusButton: UIButton!
@IBOutlet var minusButton: UIButton!
var store = Store<ViewModel, ViewModel.Action>(
reducer: ViewModel.Reducer()
)
override func viewDidLoad() {
super.viewDidLoad()
Dispatcher.shared.register(store: self.store)
store.state.count.asObservable().onserveOn(MainScheduler.instance)
.subscribe(onNext: { [weak self] count in
self?.counterLabel.text = "\(count)"
})
}
deinit {
Dispatcher.shared.unregister(identifier: self.store.identifier)
}
}
Dispatch action with UI action:
@IBAction
func onTouchPlusButton(sender: Any) {
Dispatcher.shared.dispatch(action: ViewModel.Action.plus)
}
@IBAction
func onTouchMinusButton(sender: Any) {
Dispatcher.shared.dispatch(action: ViewModel.Action.minus)
}
Scenario
(nice diagram here
Flux
- When a user interacts with a View(Controller), it propagates an
Action
- through a central
Dispatcher
, - to the various
Store
s that hold the application's data, state transition
occurs in someStore
that could responds to dispatchedAction
,- which will emit new items to
Observable
property in theseStore
.
Reactive Programming
- ViewController subscribes Store's
Observable
properties, - and react to it.
Example
To run the example project, clone the repo, and run pod install
from the Example directory first.
More complicated real world example is here.
Requirements
iOS 9 or later. Swift3.0 or later.
Installation
FluxxKit is available through CocoaPods or Carthage.
CocoaPods
pod "FluxxKit"
Carthage
github "keitaoouchi/FluxxKit"
for detail, please follow the Carthage Instruction
Author
keitaoouchi, [email protected]
License
FluxxKit is available under the MIT license. See the LICENSE file for more info.