https://github.com/keitaoouchi/fluxxkit
Unidirectional data flow for reactive programming in iOS.
https://github.com/keitaoouchi/fluxxkit
flux ios reactive-programming rxswift swift unidirectional-data-flow
Last synced: 2 months ago
JSON representation
Unidirectional data flow for reactive programming in iOS.
- Host: GitHub
- URL: https://github.com/keitaoouchi/fluxxkit
- Owner: keitaoouchi
- License: mit
- Created: 2017-05-11T01:00:03.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2019-03-31T13:24:01.000Z (about 6 years ago)
- Last Synced: 2025-04-13T00:02:06.858Z (2 months ago)
- Topics: flux, ios, reactive-programming, rxswift, swift, unidirectional-data-flow
- Language: Swift
- Size: 41 KB
- Stars: 42
- Watchers: 1
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# FluxxKit
[](https://travis-ci.org/keitaoouchi/FluxxKit)
[](https://swift.org/)
[](https://github.com/Carthage/Carthage)
[](http://cocoapods.org/pods/FluxxKit)
[](http://cocoapods.org/pods/FluxxKit)
[](http://cocoapods.org/pods/FluxxKit)## Overview
Unidirectional data flow for reactive programming in iOS. Flux and Reactive Programming.
FluxxKit is a porting [facebook's flux implementation](https://github.com/facebook/flux) in Swift.
## Example
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](https://github.com/keitaoouchi/FluxxKitExample).

### Getting Started
1. State
```swift
import FluxxKit
import RxSwiftfinal class ViewModel: StateType {
var count = Variable(0)
}
```2. Action
```swift
extension ViewModel {
enum Action: ActionType {
case plus
case minus
}
}
```3. Reducer
```swift
extension ViewModel {
final class Reducer: FluxxKit.Reducer {
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
}
}
}
}
```4. View
Create store and register it to dispatcher, and bind store's state:
```swift
import FluxxKit
import RxSWiftfinal class ViewController: UIViewController {
@IBOutlet var counterLabel: UILabel!
@IBOutlet var plusButton: UIButton!
@IBOutlet var minusButton: UIButton!
var store = Store(
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:
```swift
@IBAction
func onTouchPlusButton(sender: Any) {
Dispatcher.shared.dispatch(action: ViewModel.Action.plus)
}@IBAction
func onTouchMinusButton(sender: Any) {
Dispatcher.shared.dispatch(action: ViewModel.Action.minus)
}
```### Architecture
(:ghost: nice diagram here :ghost:)
##### FLUX for Reactive Programming
FluxxKit would not emit any event when state change like [flux](https://github.com/facebook/flux/blob/962bd9516e3fe2cf2050d7a9c27befa431c5dbca/src/stores/FluxStore.js#L78). 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.
#### Flux
```
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 some `Store` that could responds to dispatched `Action`,
- which will emit new items to `Observable` property in these `Store`.#### Reactive Programming
```
Observable ---> View
```- ViewController subscribes Store's `Observable` properties,
- and react to it.## Requirements
| Target | Version |
|-------------------|---------|
| iOS | => 8.0 |
| Swift | => 4.0 |## Installation
FluxxKit is available through [CocoaPods](http://cocoapods.org) or [Carthage](https://github.com/Carthage/Carthage).
### CocoaPods
```ruby
pod "FluxxKit"
```### Carthage
```
github "keitaoouchi/FluxxKit"
```for detail, please follow the [Carthage Instruction](https://github.com/Carthage/Carthage#if-youre-building-for-ios-tvos-or-watchos)
## Author
keitaoouchi, [email protected]
## License
FluxxKit is available under the MIT license. See the LICENSE file for more info.