Unidirectional data flow for reactive programming in iOS. Flux and Reactive Programming.
FluxxKit is a porting facebook's flux implementation in Swift.
To run the example project, clone the repo, and run pod install
from the Example directory first.
More complicated real world example like below is here.
- State
import FluxxKit
import RxSwift
final class ViewModel: StateType {
var count = Variable<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(state: ViewModel, action: Action) {
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().observeOn(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)
}
(:ghost: nice diagram here :ghost:)
FluxxKit would not emit any event when state change like flux. Instead, 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.
View -> Action -> Dispatcher -> (Middleware) -> Store -> Reducer -> Observable
- 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
.
Observable ---> View
- ViewController subscribes Store's
Observable
properties, - and react to it.
Target | Version |
---|---|
iOS | => 8.0 |
Swift | => 4.0 |
FluxxKit is available through CocoaPods or Carthage.
pod "FluxxKit"
github "keitaoouchi/FluxxKit"
for detail, please follow the Carthage Instruction
keitaoouchi, [email protected]
FluxxKit is available under the MIT license. See the LICENSE file for more info.