Skip to content

carabina/FluxxKit

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FluxxKit

Swift 3.0 Carthage compatible Version License Platform

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

  1. State
import FluxxKit
import RxSwift

final class ViewModel: StateType {
  var count = Observable<Int>(0)
}
  1. Action
extension ViewModel {
  enum Action: ActionType {
    case plus
    case minus
  }
}
  1. 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
      }
    }
  }
}
  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 Stores 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

  • 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.

GIF

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, keita.oouchi@gmail.com

License

FluxxKit is available under the MIT license. See the LICENSE file for more info.

About

Unidirectional data flow for reactive programming in iOS.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Swift 92.5%
  • Ruby 6.3%
  • Objective-C 1.2%