SwiftFlux 是 Facebook 的 Flux 架构在 Swift 中的实现。
它通过 Swift 语言提供了“单向数据流”的概念和通过类型安全的模块。
struct TodoAction {
struct Create : Action {
typealias Payload = Todo
func invoke(dispatcher: Dispatcher) {
let todo = Todo(title: "New ToDo")
dispatcher.dispatch(self, result: Result(value: todo))
}
}
}
class TodoStore : Store {
private(set) var todos = [Todo]()
init() {
ActionCreator.dispatcher.register(TodoAction.List.self) { (result) in
switch result {
case .Success(let value):
self.todos.append(value)
self.emitChange()
case .Failure(let error):
NSLog("error \(error)")
break;
}
}
}
}
let todoStore = TodoStore()
todoStore.subscribe { () -> () in
for todo in todoStore.todos {
plintln(todo.title)
}
}
ActionCreator.invoke(TodoAction.Create())
存储注册器处理程序到动作。分派器在集合中有处理程序引用。存储实例发布时,您需要释放处理程序引用。
class TodoStore {
private var dispatchTokens: [DispatchToken] = []
init() {
dispatchTokens.append(
ActionCreator.dispatcher.register(TodoAction.self) { (result) -> () in
...
}
)
}
func unregsiter() {
for token in dispatchTokens {
ActionCreator.dispatcher.unregister(token)
}
}
}
class TodoViewController {
let store = TodoStore()
deinit {
store.unregister()
}
}
`StoreBase` 包含注册/注销实用程序。您可以在覆盖自己的存储类时使用这些方法。
覆盖ActionCreator
的getter,您可以替换应用dispatcher。
class MyActionCreator: ActionCreator {
static let ownDispatcher = YourOwnDispatcher()
class MyActionCreator: ActionCreator {
override class var dispatcher: Dispatcher {
get {
return ownDispatcher
}
}
}
class YourOwnDispatcher: Dispatcher {
func dispatch<T: Action>(action: T, result: Result<T.Payload, T.Error>) {
...
}
func register<T: Action>(type: T.Type, handler: (Result<T.Payload, T.Error>) -> ()) -> String {
...
}
func unregister(dispatchToken: String) {
...
}
func waitFor<T: Action>(dispatchTokens: [String], type: T.Type, result: Result<T.Payload, T.Error>) {
...
}
}
您可以在您的Action
上使用typealias
分配自己的ErrorType
。
struct TodoAction: ErrorType {
enum TodoError {
case CreateError
}
struct Create : Action {
typealias Payload = Todo
typealias Error = TodoError
func invoke(dispatcher: Dispatcher) {
let error = TodoError.CreateError
dispatcher.dispatch(self, result: Result(error: error))
}
}
}
SwiftFlux包含基本的Store
实现工具,类似于flux-utils。
StoreBase
提供基本的store实现。例如,注册/注销Action
的回调等。
class CalculateStore: StoreBase {
private(set) var number = 0
override init() {
super.init()
self.register(CalculateActions.Plus.self) { (result) in
switch result {
case .Success(let value):
self.number += value
self.emitChange()
default:
break
}
}
self.register(CalculateActions.Minus.self) { (result) in
switch result {
case .Success(let value):
self.number -= value
self.emitChange()
default:
break
}
}
}
}
ReduceStore
通过reducer提供简化当前状态实现。reducer获取当前状态和Action的结果。reducer返回经过reduced的新状态。reducer应该是纯净的,并且不应该有副作用。ReduceStore
扩展了StoreBase
。
class CalculateStore: ReduceStore<Int> {
init() {
super.init(initialState: 0)
self.reduce(CalculateActions.Plus.self) { (state, result) -> Int in
switch result {
case .Success(let number): return state + number
default: return state
}
}
self.reduce(CalculateActions.Minus.self) { (state, result) -> Int in
switch result {
case .Success(let number): return state - number
default: return state
}
}
}
}
SwiftFlux按照MIT许可证发布。